1. 题目来源
链接:141. 周期
相关题目:
2. 题目解析
kmp
求最小循环节是对 next[]
数组性质的经典应用。具体分析看图即可:
代码:
// kmp 求循环节,kmp 的经典应用
// ne数组表示最大非平凡匹配的前后缀长度
// 假设循环节长度为 t
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e6+5;
int n;
char s[N];
int ne[N];
int main() {
int T = 1;
while (scanf("%d", &n), n) {
printf("Test case #%d\n", T ++ );
scanf("%s", s + 1);
for (int i = 2, j = 0; i <= n; i ++ ) {
while (j && s[i] != s[j +1]) j = ne[j];
if (s[i] == s[j + 1]) j ++ ;
ne[i] = j;
}
for (int i = 1; i <= n; i ++ ) {
int t = i - ne[i];
if (i % t == 0 && i / t >= 2) printf("%d %d\n", i, i / t);
}
puts("");
}
return 0;
}