Pagini recente » Cod sursa (job #466092) | Cod sursa (job #95190) | Cod sursa (job #759630) | Cod sursa (job #2231483) | Cod sursa (job #2290378)
#include <cstdio>
using namespace std;
char v[1000001];
int p[1000001];
void prefix(int n){
int i,k;
k=0;
for (i=2;i<=n;i++){
while (k && v[k+1]!=v[i])
k=p[k];
if (v[k+1]==v[i])
k++;
p[i]=k;
}
}
int main()
{
FILE *fin=fopen ("prefix.in","r");
FILE *fout=fopen ("prefix.out","w");
int t,n,i,pc,poz,l,st;
char c;
fscanf (fin,"%d\n",&t);
for (;t;t--){
c=fgetc (fin);
n=0;
while (c!='\n'){
v[++n]=c;
c=fgetc (fin);
}
prefix (n);
st=0;
poz=0;
l=0;
for (i=1;2*i<=n;i++){
if (p[2*i]==i){
st=1;
l=i;
poz=i;
}
}
if (!st){
fprintf (fout,"0\n");
continue;
}
pc=poz;
while (pc+poz<=n && p[pc+poz]>=poz){
l+=poz;
pc+=poz;
}
fprintf (fout,"%d\n",l);
}
return 0;
}