Pagini recente » Cod sursa (job #1004803) | Cod sursa (job #842574) | Cod sursa (job #1849544) | Cod sursa (job #2828046) | Cod sursa (job #444838)
Cod sursa(job #444838)
#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[0] = -1;
for(int i=1,k=-1;i<m;i++){
while(k >=0 && a[k+1]!=a[i])
k=pi[k];
if(a[k+1]==a[i])
k++;
pi[i]=k;
}
}
inline int doTest(){
m=0;
fgets(a,MAXL,fin);
for(m=0;isChar(a[m]);++m,pass[m]=false);
int maxp=0;
if(m>1){
make_prefix();
for(int i=m,k,l; i>=0 && !maxp ; i--){
pass[i]=true;
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;
}
}
}
}
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;
}