今天刚接触到KMP,很是棘手,于是百度了一篇广受关注的文章,看了许久,倒是明白一丁点走的过程,不过不太明白为什么会这样走,于是就想找到试题来实践一下,提到是找到了,很简单的题,不过对我来说还是有一定难度的,毕竟连理论还没看懂,于是便按理论上来写,很久了也没见运行正确过,于是有百度了一篇代码,看了之后很是震惊,原来我只写了开始,于是看了他的代码,虽然暂时不太懂为什么这样走,不过我还是相信慢慢的会理解的,鉴于我记性稍微够用的情况下按照他的代码先记了下来,慢慢理解罢了:

题目链接:      http://acm.hdu.edu.cn/showproblem.php?pid=1711

KMP视频链接处:      http://apps.hi.baidu.com/share/detail/18532547

大神的对KMP理解的链接处:    http://www.matrix67.com/blog/archives/115

View Code
#include<stdio.h>///KMP的模板
#include<string.h>
int a[1000005],b[11000];
int p[11000];
int n,m;
void next()//next函数,主要是存模式串的“自我匹配”的情况
{
int i,j;
p[1]=0;
j=0;
for(i=2;i<=m;i++)
{
while(j>0&&b[i]!=b[j+1])
j=p[j];
if(b[i]==b[j+1])
j=j+1;
p[i]=j;
}
}
int KMP() ////这里调用KMP函数用得到next函数
{
int i,j;
j=0;
for(i=1;i<=n;i++)
{
while(j>0&&a[i]!=b[j+1])
j=p[j];
if(a[i]==b[j+1])
j++;
if(j==m)
return i-m+1;

}
return -1;
}
int main()
{
int t,i,d;
scanf("%d",&t);
while(t--)
{
memset(p,0,sizeof(p));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=m;i++)
scanf("%d",&b[i]);
next(); ///
d=KMP(); ///
printf("%d\n",d);
}
return 0;
}

  

posted on 2011-08-15 16:45  world_ding  阅读(180)  评论(0编辑  收藏  举报