Cod sursa(job #170092)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 2 aprilie 2008 13:19:26
Problema Prefix Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <string.h>
#define K 2000009
char ch,A[K],B[K];
int pi[K],poz[1001];
int teste,k,M,N;
void make_prefix()
{
	int i,q=0;
	for(pi[1]=0,i=2 ;i<= M ;++i)  
    {  
        while ( q && A[q+1]!=A[i] )  q = pi[q];  
        if (A[q+1] == A[i])  ++q;  
        pi[i]=q;  
    }  
}  
void solve()
{
	int nr=1,max=0,n=0,q=0;
	make_prefix();
	for(int i=1;i<=N;++i)
	{
		while( q && A[q+1]!=B[i] ) q=pi[q];  
        if (A[q+1]==B[i]) ++q;  
        if ( q==M )  
        {  
			q=pi[M];  ++n;  
            if (n<=1000) poz[n]=i-M;     
        }
	}
	//if(n>1)
		//printf("%d\n", n*M);
	//else printf("0\n");
	for(int i=2;i<=n;++i)
	{
		if(poz[i]-poz[i-1]==M)
			++nr;
		else
			nr=1;
		if(nr>max)
			max=nr;
		
	}	
	printf("%d\n", max*M);
}
void scan()
{
	freopen("prefix.in", "r",stdin);
	freopen("prefix.out", "w",stdout);
	scanf("%d%c", &teste,&ch);
	for(int t=1;t<=teste;++t)
	{
		gets(B+1); 
		N=strlen(B+1);
		A[1]=B[1];
		for(k=2;k<=N;++k)
		{
			if(B[k]==B[1])
				break;
			A[k]=B[k];
		}
		M=k-1;
	/*for(int i=1;i<=M;++i)
		printf("%c", A[i]);
	printf("  ");*/
		solve();
	}	
}
int main()
{
	scan();
	return 0;
}