Pagini recente » Cod sursa (job #1200475) | Cod sursa (job #2735916) | Cod sursa (job #3226024) | Cod sursa (job #2679557) | Cod sursa (job #2721121)
#include<fstream>
#include<iostream>
#include<cstring>
#define N 1000001
using namespace std;
char s[N];
int prefix[N];
void calcul_prefix(char s[]){
int n=strlen(s),i,j;
prefix[0]=-1;
for(i=1;i<n;i++){
j=prefix[i-1];
if(s[i]==s[j+1])
prefix[i]=j+1;
else{
while(j>=0 && s[i]!=s[j+1])
j=prefix[j];
if(s[i]==s[j+1])
prefix[i]=j+1;
else
prefix[i]=-1; //=j
/*
if(s[i]==s[j+1])
j++;
prefix[i]=j;
*/
}
}
}
int prefix_periodic(char s[]){
calcul_prefix(s);
int n=strlen(s);
while(n>=0){
if(prefix[n-1]!=-1){
int t= n-(prefix[n-1]+1);
if (n%t==0)
return n;
}
n--;
}
return -1;
}
int main(){
ifstream f("prefix.in");
ofstream g("prefix.out");
f.getline(s,N);
while(f.getline(s,N)){
int x=prefix_periodic(s);
if(x!=-1)
g<<x<<endl;
else
g<<-1<<endl;
}
g.close();
}