题意:
求一个字符串中最多有多少重复的子串。
解析:
利用KMP算法的性质,求解。
不知道怎么证明,姑且记下结论,
当len % (len-next[len])=0时,循环节T=len/(len−next[len]))
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int N = 1000005;
char str[N];
int next[N];
void getNext() {
int len = strlen(str);
int j = 0, k = -1;
next[0] = -1;
while(j < len) {
if(k == -1 || str[j] == str[k])
next[++j] = ++k;
else k = next[k];
}
}
int main() {
while(scanf("%s", str) != EOF && str[0] != '.') {
getNext();
int len = strlen(str);
if(len % (len-next[len]) == 0)
printf("%d\n", len / (len-next[len]));
else puts("1");
}
return 0;
}