学习笔记-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.分治并归排序 先说堆. 这里请大家先自行了解完全二叉树的数据结构. 堆是完全二叉树.大顶堆是在堆中,任意双亲值都大 ...
随机推荐
- Fitnesse初体验
FitNesse是一套软件开发协作工具 FitNesse是帮助大家加强软件开发过程中的协作的工具.能够让客户.测试人员和开发人员了解软件要做成什么样,帮助建议软件最终是否达到了设计初衷. 什么是Fit ...
- cocoaPod相关问题
cocoap简介: 1. 简介 CocoaPods是一个负责管理iOS项目中第三方开源代码的工具,其源码在Github上开源.使用CocoaPods可以节省设置和更新第三方开源库的时间并提高工作效率. ...
- 13SpringMvc_限定某个业务控制方法,只允许GET或POST请求方式访问
这篇文章要实现的功能是:在一个Action中,有些业务方法只能是post提交上来的才能执行,有些方法是只能get提交上来的才能执行. 比如上篇文章中的UserAction.java(代码如下) pac ...
- windows系统命令服务安装卸载
安装: sc create PDW.CHM.WebAPI binPath= "%~dp0PDW.CHM.WebAPI.exe" start= autosc start PDW.CH ...
- mysql-advanced-5.6.23-linux-glibc2.5-x86_64安装
0,二进制安装: mysql-advanced-5.6.23-linux-glibc2.5-x86_64.zip 1,软件包 mysql-advanced-5.6.23-linux-glibc2. ...
- js 中常用的方法
1..call() 将.call()点之前的属性或方法,继承给括号中的对象. 2.(function(){xxx})() 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数, ...
- m3u8字段意义解析
m3u8字段意义解析 HLS,Http Live Streaming是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件 ...
- TinyFrame框架中的UOW使用方式纠正
我自己的框架中,UOW是可以通过反射提取具体的Repository的,也可以调用Commit方法. 但是正确的应用方式应该是: Using(var uow = new UnitOfWork()) { ...
- Activiti系列:带有serviceTask的或者定时启动任务的流程部署失败的原因分析
在将两个带有serviceTask任务的流程部署到数据库的时候发现无法导入,最终分析出如下问题: 1)流程1是打算让定时启动事件可以每小时触发一次 由于原来是用 R/2015-11-01T01:00: ...
- js字符串截取函数slice()、substring()、substr()
摘要 在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与 ...