题目
求字符串里有多少组循环节。
分析
kmp,算出循环节的长度,如果匹配不出循环节,只有1组,否则用字符串长度除以循环节长度。
代码
#include <cstdio>
#include <cstring>
using namespace std;
char s[1000001]; int p[1000001],j;
int main(){
while (scanf("%s",s)&&s[0]!='.'){
p[0]=j=-1; int l=strlen(s);
for (int i=1;i<l;i++){
while (j>=0&&s[j+1]!=s[i]) j=p[j];
if (s[j+1]==s[i]) j++; p[i]=j;
}
if (l%(l-p[l-1]-1)) puts("1");
else printf("%d\n",l/(l-p[l-1]-1));
}
return 0;
}