Cod sursa(job #1201168)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 24 iunie 2014 16:11:37
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<cstdio>
const int N=1000000;
int prefix[N+1];
char s[N+1];
FILE*in,*out;
int t,n,max;
void scan(){
    fscanf(in,"%d\n",&t);
}
void init(){
    in=fopen("prefix.in","r");
    out=fopen("prefix.out","w");
    scan();
}
void closeFiles(){
    fclose(in);
    fclose(out);
}
void scanTest(){
    fgets(s,N+1,in);
}
void setPrefix(){
    int i,k=0;
    prefix[1]=0;
    for(i=2;i<=n;i++){
        while(k>0&&s[i]!=s[k+1])
            k=prefix[k];
        if(s[i]==s[k+1])
            k++;
        prefix[i]=k;
    }
}
void solve(){
    int i,k=0,pLenght=0;
    bool f=true;
    max=0;
    setPrefix();
    for(i=1;i<=n;i++){
        if(s[i]==s[k+1]&&i!=k+1){
            k++;
            if(f&&k==1)
                pLenght=i-1;
            if(k==pLenght){
                k=0;
                if(i>max)
                    max=i;
            }
            f=false;
        }
        else{
            k=0;
            f=true;
            if(s[i]==s[1]&&i!=1){
                k=1;
                pLenght=i-1;
                if(i==2)
                    if(2>max)
                        max=2;
            }
        }
    }
    fprintf(out,"%d\n",max);
}
void shift(){
    int i;
    for(i=n;i>=1;i--)
        s[i]=s[i-1];
}
int stringLenght(char s[N+1]){
    int i=0;
    while(s[i]!='\0')
        i++;
    return i;
}
void initTest(){
    scanTest();
    n=stringLenght(s);
    shift();
}
int main(){
    init();
    while(t>0){
        t--;
        initTest();
        solve();
    }
    closeFiles();
    return 0;
}