Pagini recente » Cod sursa (job #2843867) | Cod sursa (job #2013332) | Cod sursa (job #1506587) | Cod sursa (job #1610806) | Cod sursa (job #444833)
Cod sursa(job #444833)
#include <cstdio>
#include <bitset>
using namespace std;
FILE* fin=fopen("prefix.in","r");
FILE* fout=fopen("prefix.out","w");
#define MAXL 1000005
#define isChar(chr) ('a'<=(chr)&&(chr)<='z')
char a[MAXL];
bitset<MAXL> pass;
int pi[MAXL],m;
void make_prefix(){
pi[1]=0;
for(int i=2,k=0;i<=m;i++){
while(k && a[k+1]!=a[i])
k=pi[k];
if(a[k+1]==a[i])
k++;
pi[i]=k;
}
}
inline int doTest(){
a[0]=' ',m=0;
fgets(a+1,MAXL,fin);
for(m=1;isChar(a[m]);++m,pass[m]=false);
--m;
make_prefix();
int maxp=0;
for(int i=m,k,l;i;i--){
int l=i-pi[i];
if(l<=i){
k = pi[i];
while(k>=l && !pass[k]){
if(k-pi[k]!=l)
break;
pass[k]=true;
k=pi[k];
}
if( k==l-1 && i+1 > maxp){
maxp=i+1;
}
}
}
if(maxp==2&&a[1]!=a[2]){
return 0;
}else return maxp;
}
int main(){
int t;
for(fscanf(fin,"%d\n",&t);t;--t){
fprintf(fout,"%d\n",doTest());
}
fclose(fin);
fclose(fout);
return 0;
}