Pagini recente » Cod sursa (job #1974417) | Rating Andrei Carina (cni_cary) | Cod sursa (job #1799705) | Cod sursa (job #1914741) | Cod sursa (job #2754829)
#include<fstream>
#include<iostream>
#include<cstring>
#define N 1000001
using namespace std;
char s[N];
int pi[N];
using namespace std;
int* prefix(char *p ){
int i,n;
n=strlen(p);
int q=0;
pi[0]=0; //trebuie separat
for(i=1;i<n;i++){
//q=pi[i-1];
while(q>0 && p[i]!=p[q]){
q=pi[q-1];
}
if(p[i]==p[q])
q++;
pi[i]=q;
}
return pi;
}
int prefix_periodic(char s[]){
prefix(s);
int n=strlen(s);
while(n>=1){
if(pi[n-1]!=0){
int t= n-pi[n-1];
if (n%t==0)
return n;
}
n--;
}
return 0;
}
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();
}