Cod sursa(job #345914)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 5 septembrie 2009 15:42:07
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
# include <stdio.h>
# include <string.h>

const long int MAXL=1000000;

char cuvant[11][MAXL+10];
long int prefix[MAXL+1],perioada[MAXL+1];

long int det_lungime(char *s)
{
     long int m,li=1,lf=MAXL;
     while (li<=lf)
           {
           m=(li+lf)/2;
           if (s[m]&&!s[m+1]) return m;
           if (s[m]) li=m+1;
           else lf=m;
           }
     return li;
}

long int det_prefix(char *s, long int n)
{
     long int i,already=0,sol=0;
     prefix[1]=0;perioada[1]=1;
     for (i=2;i<=n;i++)
         {
         while (already&&s[i]!=s[already+1]) already=prefix[already];
         if (s[i]==s[already+1]) already++; 
         prefix[i]=already;
         perioada[i]=i;
         if (perioada[already]==perioada[i-already]) 
            {
            perioada[i]=perioada[already];
            sol=i;
            }
         }
     return sol;
}        

int main()
{
    long int nteste,test,lung;
    FILE *f=fopen("prefix.in","r");
    FILE *g=fopen("prefix.out","w");
    fscanf(f,"%ld",&nteste);
    fgets(cuvant[0],MAXL+1,f);
    for (test=1;test<=nteste;test++)
        {
        fgets(cuvant[test]+1,MAXL+1,f);
        lung=det_lungime(cuvant[test]);
        printf("%ld\n",lung);
        //lung=strlen(cuvant[test]+1);
        fprintf(g,"%ld\n",det_prefix(cuvant[test],lung-1));
        }
    fclose(f);
    fclose(g);
    getchar();
    return 0;
}