Cod sursa(job #291274)

Utilizator otilia_sOtilia Stretcu otilia_s Data 29 martie 2009 17:01:14
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#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;
}