Cod sursa(job #290161)

Utilizator flamecataCiobanu Alexandru-Catalin flamecata Data 27 martie 2009 16:26:09
Problema Prefix Scor 100
Compilator cpp Status done
Runda aa Marime 1.31 kb
#include<stdio.h>   
#include<string.h>   
#define infile "prefix.in"   
#define outfile "prefix.out"   
#define nmax 1001*1001   
char s[nmax]; //sirul   
int p[nmax]; //prefixul   
int n; //lungimea sirului   
  
void prefix()   
    {   
    int i,k=-1;   
    p[0]=-1;   
    for(i=1;i<n;i++)   
        {   
        while(k>=0&&s[i]!=s[k+1]) k=p[k]; //locul de unde putem incepe verificarea   
        if(s[i]==s[k+1]) k++; //sunt egale   
        p[i]=k; //lungimea de unde putem porni   
        }   
    }   
  
int prefix_maxim()   
    {   
    int i,lmax=0;   
    for(i=1;i<n;i++)   
        if(p[i]>=0&&!((i+1)%(i-p[i]))) //daca este prefix, si daca lungimea prefixului periodic este multiplu de lungimea prefixului normal   
            lmax=i+1; //aceasta este lungimea   
    return lmax; //returnam lungimea maxima   
    }   
  
int main()   
{   
int t;   
freopen(infile,"r",stdin);   
freopen(outfile,"w",stdout);   
  
scanf("%d\n",&t); //numarul de teste   
while(t--) //rezolvam fiecare test   
    {   
    scanf("%s",s); //citim sirul   
    n=strlen(s); //lungimea sirului   
    prefix(); //calculeaza prefixul sirului   
    printf("%d\n",prefix_maxim()); //afisem lungimea prefixului periodic maxim   
    }   
  
fclose(stdin);   
fclose(stdout);   
return 0;   
}