【题目大意】
求前缀的循环节(如果有的话)
【题目分析】
求循环节的问题,用KMP算法求出来,但是要注意需要判断是否能够循环,必须是当前长度的约数
【代码】
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char s[1000001];
int f[1000001];
int main()
{
int n,t=0;
while (scanf("%d",&n)==1&&n)
{
scanf("%s",s);
f[0]=0;f[1]=0;
for (int i=1;i<n;++i)
{
int j=f[i];
while (j&&s[i]!=s[j]) j=f[j];
if (s[i]==s[j]) j++;
f[i+1]=j;
}
printf("Test case #%d\n",++t);
for (int i=2;i<=n;++i)
if (f[i]>0&&(i%(i-f[i])==0)) printf("%d %d\n",i,i/(i-f[i]));
printf("\n");
}
return 0;
}