Cod sursa(job #3436)
Utilizator | Data | 25 decembrie 2006 23:12:39 | |
---|---|---|---|
Problema | Prefix | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.42 kb |
#include<stdio.h>
#include<string.h>
const int maxn = 1000001;
int le[maxn];
char a[maxn];
int i;
int ok[maxn];
int j;
int n;
int m;
int l[maxn];
int max;
int main()
{
freopen("prefix.in","r",stdin);
freopen("prefix.out","w",stdout);
scanf("%d\n",&n);
int i1;
for(i1=1;i1<=n;i1++)
{
gets(a);
l[0]=-1;
l[1]=0;
j=0;
m=strlen(a);
for(i=1;i<=m;i++)
{
l[i]=0;
le[i]=0;
}
i=1;
for ( i = 0; i<=m; i++) {
l[i + 1] = l[i] + 1;
while (l[i + 1] > 0 &&
a[i] != a[l[i + 1] - 1])
l[i + 1] = l[l[i + 1] - 1] + 1;
}
/* while (i<=m)
{
if (a[i]==a[j])
{
l[i]=l[i-1]+1;
le[i]=le[i-1]+1;
i++;
j++;
}
else
{
if (j>1) j=l[j];
else
{
l[i]=0;
le[i]=0;
i++;
}
}
} */
max=0;
for(i=1;i<=m;i++)l[i]=l[i+1];
int ver;
for(i=0;i<=m;i++)
{
j=i;
ver=0;
while (j<m&&l[j+i+1]==j+1)
{
j=j+i+1;
ver=1;
}
if (max<j+1&&ver) max=j+1;
i=j;
}
printf("%d\n",max);
}
return 0;
}