分析: 稍微改动POJ2406 循环节
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000000 + 5;
int next[maxn];
void getnext(int len, char *src){
int i = 0, j = -1;
next[0] = j;
while (i < len){
while (j != -1 && src[i] != src[j]){
j = next[j];
}
i++; j++;
if (j >= len)
next[i] = next[j-1];
else
next[i] = j;
}
}
int main(){
char s[maxn];
int kase = 1, num;
while (scanf("%d", &num) && num){
scanf("%s", s);
getnext(num, s);
printf("Test case #%d\n", kase++);
for(int i = 1; i<=num; i++){ //每个位置都要尝试是否为周期串
int flag = i%(i - next[i]);
if (!flag)
if (i/(i-next[i]) != 1)
printf("%d %d\n",i, i/(i-next[i]));
}
puts("");
}
return 0;
}