Period
#include<algorithm>#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
using namespace std;
void Getnext(char *p,int next[])
{
int j=0;
int k=-1;
next[0]=-1;
int pLen=strlen(p);
while(j<pLen)
{
if(k==-1||p[j]==p[k])
{
++j;
++k;
next[j]=k;
}
else
k=next[k];
}
}
char a[1000004];
int pp[1000004];
int main()
{
int n;
int r=0;
while(~scanf("%d",&n))
{
if(n==0)
break;
scanf("%s",a);
Getnext(a,pp);
int aLen=strlen(a);
printf("Test case #%d\n",++r);
for(int i=2; i<=n; i++)
{
int len=i-pp[i];
if(len!=i&&i%len==0)
printf("%d %d\n",i,i/len);
}
printf("\n");
}
}
next数组:前缀和后缀的最大匹配值
长度为Len的字符串的最小循环节为Len-next[Len];