Cod sursa(job #291274)
#include <stdio.h>
#include <string.h>
#define LMAX 1000008
int lung;
char sir[LMAX];
int urm[LMAX];
void calc_urm()
{
int k=0,x;
urm[1]=0;
for (x=2;x<=lung;x++)
{
while (k>0&&sir[x-1]!=sir[k]) k=urm[k];
if (sir[x-1]==sir[k]) ++k;
urm[x]=k;
}
}
int verif_per()
{
int i;
for (i=lung;i>0;i--)
{
int lp,k,ok=0;
lp=i-urm[i];
if (urm[i])
{
k=i; ok=1;
while (urm[k]>=lp&&ok)
{
k=urm[k];
if (k>lp&&k-urm[k]!=lp) ok=0;
}
if (k!=lp) ok=0;
}
if (ok) return i;
}
return 0;
}
int lprefix()
{ int i;
lung=strlen(sir);
calc_urm();
return verif_per();
}
int main()
{
FILE *fin=fopen("prefix.in","r");
FILE *fout=fopen("prefix.out","w");
int t;
fscanf(fin,"%d",&t);
while (t--)
{
fscanf(fin,"%s",&sir);
fprintf(fout,"%d\n",lprefix());
}
fclose(fin); fclose(fout);
return 0;
}