思路
kmp求最小循环节的题目,next数组是一个前缀的前缀和后缀相同的最长长度,所以n向前跳最小的长度就是最小的循环节,答案就是n-next[n],注意不可整除时输出1
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int nxt[1000100];
char s[1000100];
int find(char *s,int len){
nxt[0]=0;
nxt[1]=0;
for(int i=1;i<len;i++){
int j=nxt[i];
while(j&&s[i]!=s[j])
j=nxt[j];
if(s[i]==s[j])
nxt[i+1]=j+1;
else
nxt[i+1]=0;
}
return (len%(len-nxt[len]))?1:len/(len-nxt[len]);
}
int main(){
while(scanf("%s",s)){
if(s[0]=='.')
break;
printf("%d
",find(s,strlen(s)));
}
}