Cod sursa(job #1103)

Utilizator alextheroTandrau Alexandru alexthero Data 12 decembrie 2006 18:29:24
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <stdio.h>
#include <string.h>

#define nmax 1000005

char s[nmax];
int t,n,p[nmax],pref[nmax];

int kmp_calculeaza() {
     n=strlen(s)-1;
     long k=0;
     p[1]=0;
     pref[0]=1;
     int max=0;
     for(int i=2;i<=n;i++) {
         while ((k>0) && (s[k+1]!=s[i])) k=p[k];
         if(s[k+1]==s[i]) k++;
         p[i]=k;
         if ((p[i]>0) && (i % (i-p[i])==0)) max=i;
     }    
 /*    for(int i=1;i<=n;i++) printf("%d ",p[i]);
     printf("\n");
     for(int i=1;i<=n;i++) printf("%d ",pref[i]);
     printf("\n");*/
     return max;
}

int main() {
    freopen("prefix.in","r",stdin);
    freopen("prefix.out","w",stdout);
    
    scanf("%d\n",&t);
    for(int i=1;i<=t;i++) {
            memset(s,0,sizeof(s));
            scanf("%s\n",&s);
            for(int j=strlen(s);j>=1;j--) s[j]=s[j-1];
            printf("%d\n",kmp_calculeaza());            
    }    
    return 0;
}