Cod sursa(job #498190)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 4 noiembrie 2010 13:54:20
Problema Prefix Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<stdio.h>
#include<string.h>
#define Nmax 1000010

int pi[Nmax],i,n,T,sol1,sol2,cnt,start,k;
char sir[Nmax];

int main()
{
	freopen("prefix.in","r",stdin);
	freopen("prefix.out","w",stdout);
	
	scanf("%d\n",&T);
	
	for( ; T ; --T )
	{
		scanf("%s\n",sir+1);
		memset(pi,0,sizeof(pi));
		
		n = strlen(sir+1);
		
		if( n == 1 ) { printf("0\n"); continue ; }
		
		k = 0 ; sol1 = sol2 = 0 ;  
		
		for( i = 2 ; i <= n ; ++i )
		{
			while( ( k > 0 ) && ( sir[k+1] != sir[i] ) ) 
				k = pi[k] ;
			
			if( sir[k+1] == sir[i] )
				k++;
			
			pi[i] = k ; 
		}
		
		for( i = 1, cnt = 0 ; !pi[i] && i<=n ; ++i, ++cnt) ;
		if( i > n ) {printf("0\n"); continue;}
		while( pi[i] == pi[i-1] && i <= n ) i++;
		
		sol1 = (i/cnt) * cnt ;
		
		cnt = 0 ; start = 0;
		for( i = 1 ; i <= n ; i++ )
		{
			if( !(i&1) && pi[i] == (i>>1) )
			{
				cnt = pi[i] ; 
				sol2 = i ;  
				start = i ; 
			}
			else 
				if( ( cnt && ( i % cnt ) == 0 ) && pi[i] == pi[start] + i-start )
					sol2 = i ;
		}
		
		if( sol1 > sol2 ) printf("%d\n",sol1);
		else 			  printf("%d\n",sol2);
	}
	
	return 0;
}