不懂如何用nxt数组求最小循环节的看这里
#pragma warning(disable:4996)
#include <cstdio>
#include <cstring>
using namespace std;
char s[1000005];
int nxt[1000005];
void get_nxt(){
int len = strlen(s);
int i = 0, j = -1;
nxt[0] = -1;
while (i < len){
if (j == -1 || s[i] == s[j]){
i++, j++;
nxt[i] = j;
}
else
j = nxt[j];
}
}
int main(){
int n, kase = 1;
while (scanf("%d", &n) && n){
scanf("%s", s);
get_nxt();
printf("Test case #%d\n", kase++);
for (int i = 2; i <= n; i++){
int ans = i / (i - nxt[i]);
if (i % (i - nxt[i]) == 0 && ans > 1){
printf("%d %d\n", i, ans);
}
}
puts("");
}
return 0;
}