题意:求出字符串的最大循环次数,例如abababab是4
我们考虑求next数组时,上下两个字符串不重叠的部分长度为t = len - next[len]
观察重叠部分,则下方字符串的[1,t] = 上方的[t+1,2t], 下方字符串的[t+1,2t] = 上方的[2t+1,3t], ...
如果len - t是t的整数倍,则可以得到字符串循环节的长度为t,否则没有循环节。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 2e6 + 10;
char p[maxn];
int ne[maxn];
void getnext(char *p) {
int n = strlen(p + 1);
for (int i = 2, j = 0; i <= n; i++) {
while (j && p[j + 1] != p[i]) j = ne[j];
if (p[j + 1] == p[i]) j++;
ne[i] = j;
}
}
int main() {
while (scanf("%s", p + 1) && p[1] != '.') {
getnext(p);
int ans = 1;
int l = strlen(p + 1);
if (l % (l - ne[l]) == 0) ans = l / (l - ne[l]);
printf("%d\n", ans);
}
}