给定一个字符串,求这个字符串最多由一个字符串重复几次构成。
就是求最小重复字串。想到了用kmp的next数组做,但没想到是用最后的i失配时回退的位置来做的。
代码:
//Memory: 5100K Time: 125MS
//Language: C++ Result: Accepted
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=1000005;
char s[maxn];
int next[maxn];
int getnext(){
int i=-1,j=0,len=strlen(s);
next[0]=-1;
while(j<len){
if(i==-1 || s[i]==s[j]){
if(s[++i]==s[++j]) next[j]=next[i];
else next[j]=i;
}
else i=next[i];
}
int len_ans=len-i;
if(len%len_ans==0) return len/len_ans;
else return 1;
}
int main(){
//freopen("in.txt","r",stdin);
while(~scanf("%s",s)){
if(strcmp(s,".")==0) break;
memset(next,0,sizeof(next));
cout<<getnext()<<endl;
}
return 0;
}