Pagini recente » Cod sursa (job #2435377) | Cod sursa (job #3145966) | Cod sursa (job #760163) | Cod sursa (job #2899759) | Cod sursa (job #1279469)
#include <stdio.h>
#define MAXN 1000000
int n, pi[MAXN], l[MAXN];
char s[MAXN];
inline int maxpf(){
int i, r, max, x;
pi[0]=0;
r=0;
for(i=1; i<n; i++){
l[i]=0;
while((r>0)&&(s[i]!=s[r])){
r=pi[r-1];
}
if(s[i]==s[r]){
r++;
}
pi[i]=r;
}
for(i=n-1; i>0; i--){
x=i+1-pi[i];
if((i+x<n)&&(pi[i+x]==i+1)){
l[i]=l[i+x]+x;
}
}
max=0;
for(i=0; 2*i+1<n; i++){
x=2*i+1;
if((pi[x]==i+1)&&(max<l[x]+2*(i+1))){
max=l[x]+2*(i+1);
}
}
return max;
}
int main(){
int T, t, a;
char ch;
FILE *fin, *fout;
fin=fopen("prefix.in", "r");
fout=fopen("prefix.out", "w");
fscanf(fin, "%d ", &T);
for(t=0; t<T; t++){
n=0;
ch=fgetc(fin);
while(ch!='\n'){
s[n++]=ch;
ch=fgetc(fin);
}
a=maxpf();
fprintf(fout, "%d\n", a);
}
fclose(fin);
fclose(fout);
return 0;
}