LA 3026 Period——kmp求n次最小循环节
原创
©著作权归作者所有:来自51CTO博客作者软糖酱八号机的原创作品,请联系作者获取转载授权,否则将追究法律责任
注意要每行后一个空行,不能两两之间一个空行
#include <cstdio>
using namespace std;
const int maxn = 1e6 + 10;
char str[maxn];
int flag = 0, n, Next[maxn];
int main() {
while (~scanf("%d", &n) && n) {
scanf("%s", str);
int i = 0, j = 0; Next[i] = j;
for (int i = 1; i < n; i++) {
while (j && str[i] != str[j]) j = Next[j - 1];
if (str[i] == str[j]) j++;
Next[i] = j;
}
printf("Test case #%d\n", ++flag);
for (i = 1; i < n; i++) {
int len = i + 1 - Next[i];
if (Next[i] && (i + 1) % len == 0) {
printf("%d %d\n", i + 1, (i + 1) / len);
}
}
printf("\n");
}
return 0;
}