如果P[1...K]与P[L-k+1...L]匹配(L为字符串长度),那么P[L-k+1...L]这一段字符一定是在重复P[1...L] - P[L-K+1...L]这段字符。
反证法:如果不是重复这一段,那么P[1...K]与P[L-k+1...L]不可能匹配。可以画图试一试。
注意字符串开始位置是0.下面是代码:
#include<stdio.h>
#include<string.h>
#define maxn 1000500
char s[maxn];
int next[maxn];
int n;
void kmp_next(char *s,int len)
{
int i = 0;
int j = -1;
next[0] = -1;
while(i < len)
{
while(j >=0 && s[i] != s[j]) j = next[j];
i++;
j++;
next[i] = j;
}
}
int main()
{
int T = 0;
while(scanf("%d",&n) && n)
{
T++;
scanf("%s",s);
int len = strlen(s);
kmp_next(s,len);
printf("Test case #%d\n",T);
for(int i = 2; i <= len; i++)
{
if(next[i] != 0 && i%(i-next[i])== 0) printf("%d %d\n",i,i/(i-next[i]));
}
printf("\n");
}
return 0;
}