Cod sursa(job #3437)

Utilizator mariusdrgdragus marius mariusdrg Data 25 decembrie 2006 23:13:22
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include<stdio.h>
#include<string.h>

const int maxn  = 10000001;


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;

}