分析:根据Next数组的含义不难知道,错位部分长度为i-Next[i]。如果这i个字符组成一个周期串,那么错位的部分恰好是一个循环节,因此k(i-Next[i])=i。注意k>1,因此i-Next[i]不能等于i,即必须有Next[i]>0.
代码如下:
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e6+10;
char s[maxn];
int Next[maxn];
int n;
int kase = 0;
void make_next(){
Next[0] = Next[1] = 0;
for (int i=1; i<n; i++) {
int j= Next[i];
while (j && s[i]!=s[j]) j = Next[j];
Next[i+1] = s[i]==s[j]?j+1:0;
}
}
void Print(){
printf("Test case #%d\n",++kase);
for (int i=2; i<=n; i++) {
if (Next[i] && i%(i-Next[i])==0) printf("%d %d\n",i,i/(i-Next[i]));
}
printf("\n");
}
int main(){
while (scanf("%d",&n) && n){
scanf("%s",s);
make_next();
Print();
}
return 0;
}