标签:kmp
#include <stdio.h>
#include <string.h>
int next[1000005];
void build_next(char str2[])
{
int i=0,j=-1;
next[0] = -1;
while (str2[i])
{
if (j==-1 || str2[i] == str2[j])
{
i++;
j++;
// if (str2[i] != str2[j])
// {
next[i] = j; //传说中的f[j],储存前缀相同的最长最大值
// }
// else
// next[i] = next[j];
}
else
j = next[j];
}
}
// int KMP(int len1,int len2)
// {
// build_next(len2);
// int i=0,j=0,cnt;
//
// while (i < len1)
// {
// if (j==-1 || str1[i] == str2[j])
// {
// i++;
// j++;
// if(j==len2)
// return i-len2+1;
// }
// else
// j = next[j];
// }
// return -1;
// }
int main()
{
int N,n,m,i,k,t;
//scanf("%d",&N);
char str[1000005];
k=1;
while (~scanf("%d",&N),N)
{
scanf("%s",&str);
build_next(str);
printf("Test case #%d\n",k++);
for (i=2;str[i-1];i++)
{
t= i-next[i];
if (i%t==0 && i/t>1)
{
printf("%d %d\n",i,i/t);
}
}
// for (i=0;i<N;i++)
// {
// printf("%d",next[i]);
// }
putchar('\n');
}
return 0;
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
分析:此题目一开始真心没读懂,后来看别人的题解才知道题意。就是说从字符串的第二个开始,看前面是循环串吗,是的话就输出此时的位置,和循环串的周期,周期必须大于1
字符编号从0开始,那么if(i%(i-next[i])==0),则i前面的
串为一个轮回串,其中轮回子串出现i/(i-next[i])次。有点推导公式的感觉
对KMP算法又进一步了解了
3 aaa 12 aabaabaabaab 0
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
标签:kmp
原文地址:http://blog.csdn.net/xinwen1995/article/details/46129419