Pagini recente » Cod sursa (job #2715989) | Cod sursa (job #2551850) | Cod sursa (job #1000034) | Cod sursa (job #235477) | Cod sursa (job #498190)
Cod sursa(job #498190)
#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;
}