对于KMP的理解,hdu 1711

本文分享了作者初学KMP算法的心路历程,通过解析KMP算法的自我匹配过程,记录了从理论到实践的艰难过渡。文章提供了KMP算法的C语言实现代码,并附带了详细的注释,帮助读者更好地理解和应用这一算法。

今天刚接触到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;
}
 
 

  

转载于:https://www.cnblogs.com/world-ding/articles/2139642.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值