KMP算法的熟练运用
由于KMP预处理是对模式串本身进行KMP
所以串尾、pre[size]部分完全一致,且pre[size]和pre[pre[size]]部分一致……
所以就代表一个循环节
若(size-pre[size])刚好能被size整除,则为循环节
#include <cstdio>
#include <iostream>
#include <string>
#define MAXN 1000005
using namespace std;
string str;
int pre[MAXN];
int main() {
while(cin >> str) {
if(str==".") break;
int size = str.length();
str = ‘ ‘ + str;
pre[1] = 0; int len = 0;
for(int i=1;i<size;++i) {
while(len&&str[i+1]!=str[len+1]) len = pre[len];
if(str[i+1]==str[len+1]) len++;
pre[i+1] = len;
}
if(pre[size]!=0&&size%(size-pre[size])==0) printf("%d\n",size/(size-pre[size]));
else puts("1");
}
return 0;
}