学习笔记-KMP算法
按照学习计划和TimeMachine学长的推荐,学习了一下KMP算法。
昨晚晚自习下课前粗略的看了看,发现根本理解不了高端的next数组啊有木有,不过好在在今天系统的学习了之后感觉是有很大提升的了,起码能打出模板了。。。(无奈)
KMP算法是一种字符串匹配算法,能够最坏在线性时间跑出答案的算法,时间复杂度为O(n+m)
对于字符串匹配,原始的套路在于两个串直接枚举起来。当要被查询的串T【】与查询串P【】的首字母匹配时便依次比较下去,一旦失配后T【】串的下标+1继续找,直到找到为止
KMP算法的做法也是如此,只不过在失配后会进行额外的跳跃,避免了大量的冗余操作,节约时间,而对于要跳跃的步数则引入next数组初始化后得出。
具体的讲解还是参见此blog:http://www.cnblogs.com/c-cloud/p/3224788.html
(博主写的非常通俗易懂,但是Bi~(NTMD)能不能不要把标程写残啊,坑人啊!!)
当然还是Matrix67神犇的讲解更加为人信服:http://www.matrix67.com/blog/archives/115
下面是个模板,查询串在被查询串中出现的次数。:
【get_next过程初始化出next数组(通用);KMP过程进行匹配(根据不同题目对统计的答案进行修改即可)】
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char t[1000010], p[1000010];
int next[1000010];
int n,m;int ans;
void get_next()
{
int k=-1;
int j=0;
next[0]=-1;
while (j<m)
{
if (k==-1 || p[j]==p[k])
{
j++;
k++;
if (p[j]!=p[k])
next[j] = k;
else
next[j] = next[k];
}
else
k=next[k];
}
}
void kmp()
{
int i=0,j=0;
while (i<n)
{
if (j==-1 || p[j]==t[i])
{
i++;
j++;
}
else
j = next[j];
if (j==m)
{
ans++;
j=next[j];
}
}
}
int main()
{
int time;
scanf("%d",&time);
while (time--)
{
scanf("%s",p);
scanf("%s",t);
n=strlen(t);
m=strlen(p);
get_next();
ans=0;
kmp();
printf("%d\n",ans);
}
return 0;
}
学习笔记-KMP算法的更多相关文章
- [一本通学习笔记] KMP算法
KMP算法 对于串s[1..n],我们定义fail[i]表示以串s[1..i]的最长公共真前后缀. 我们首先考虑对于模式串p,如何计算出它的fail数组.定义fail[0]=-1. 根据“真前后缀”的 ...
- [ML学习笔记] XGBoost算法
[ML学习笔记] XGBoost算法 回归树 决策树可用于分类和回归,分类的结果是离散值(类别),回归的结果是连续值(数值),但本质都是特征(feature)到结果/标签(label)之间的映射. 这 ...
- 学习笔记 - Manacher算法
Manacher算法 - 学习笔记 是从最近Codeforces的一场比赛了解到这个算法的~ 非常新奇,毕竟是第一次听说 \(O(n)\) 的回文串算法 我在 vjudge 上开了一个[练习],有兴趣 ...
- 算法笔记--KMP算法 && EXKMP算法
1.KMP算法 这个博客写的不错:http://www.cnblogs.com/SYCstudio/p/7194315.html 模板: next数组的求解,那个循环本质就是如果相同前后缀不能加上该位 ...
- 来去学习之---KMP算法--next计算过程
一.概述 KMP算法是一种字符串匹配算法,比如现有字符串 T:ABCDABCDABCDCABCDABCDE, P:ABCDABCDE P字符串对应的next值:[0,0,0,0,1,2,3,4,0] ...
- 学习笔记——EM算法
EM算法是一种迭代算法,用于含有隐变量(hidden variable)的概率模型参数的极大似然估计,或极大后验概率估计.EM算法的每次迭代由两步组成:E步,求期望(expectation):M步,求 ...
- 数据挖掘学习笔记--AdaBoost算法(一)
声明: 这篇笔记是自己对AdaBoost原理的一些理解,如果有错,还望指正,俯谢- 背景: AdaBoost算法,这个算法思路简单,但是论文真是各种晦涩啊-,以下是自己看了A Short Introd ...
- Java学习笔记——排序算法之快速排序
会当凌绝顶,一览众山小. --望岳 如果说有哪个排序算法不能不会,那就是快速排序(Quick Sort)了 快速排序简单而高效,是最适合学习的进阶排序算法. 直接上代码: public class Q ...
- Java学习笔记——排序算法之进阶排序(堆排序与分治并归排序)
春蚕到死丝方尽,蜡炬成灰泪始干 --无题 这里介绍两个比较难的算法: 1.堆排序 2.分治并归排序 先说堆. 这里请大家先自行了解完全二叉树的数据结构. 堆是完全二叉树.大顶堆是在堆中,任意双亲值都大 ...
随机推荐
- flex4 s:Datagrid <s:typicalItem
<s:DataGird <s:typicalItem 这个标签相信大家很陌生吧, 我也是今天准备讲的时候才看到,估计是 flex4.5.1 新加东西,果然摸索 了下,这个标签作用也蛮好用的 ...
- cygwin下的vim 的vimrc配置
1.一直接照 vim 在linux的配置使用 cygwin下的 vi. vim --version 之后,出现了帮助...
- Android 中JNI创建实例
参考文档: http://blog.sina.com.cn/s/blog_a11f64590101924l.html http://www.cnblogs.com/hoys/archive/2010/ ...
- ArcGis 统计方法
from:http://blog.sina.com.cn/s/blog_4177d50b0100fjbg.html 概述 一般常用的统计功能例如:唯一字段统计.数据行数统计.数据值求和统计等. 1.基 ...
- 使用地址栏访问CXF Webservice写法
/* * 通过url调用 * http://localhost:8080/EFP/webService/TestWebservice/testOut/arg0/liuyx */ http://loca ...
- U3D assetbundle加载
using UnityEngine; using System.Collections; public class testLoadFromAB : MonoBehaviour { IEnumerat ...
- [转]World Wind Java开发之四——搭建本地WMS服务器
在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...
- XPath 详解,总结
XPath简介 XPath是W3C的一个标准.它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计.目前有XPath1.0和XPath2.0两个版本.其中Xpath1.0是199 ...
- python大数据工作流程
本文作者:hhh5460 大数据分析,内存不够用怎么办? 当然,你可以升级你的电脑为超级电脑. 另外,你也可以采用硬盘操作. 本文示范了硬盘操作的一种可能的方式. 本文基于:win10(64) + p ...
- 北京联想招聘-Android高级工程师(5-7年) 加入qq 群:220486180 或者直接在此 留言咨询
Job ID #: 47979 Position Title: 高级Android开发工程师 Location: CHN-Beijing Functional Area: Research/Devel ...