学习笔记-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.分治并归排序 先说堆. 这里请大家先自行了解完全二叉树的数据结构. 堆是完全二叉树.大顶堆是在堆中,任意双亲值都大 ...
随机推荐
- 第23章 SEH结构化异常处理(2)_编译器对系统SEH机制的封装
23.2 编译器层面对系统SEH机制的封装 23.2.1 扩展的EXCEPTION_REGISTRATION级相关结构:VC_EXCEPTION_REGISTRATION (1)VC_EXCEPTIO ...
- [资料]Nginx做IP访问限制以及正则规则
nginx配置location总结及rewrite规则写法 Nginx Location配置总结 Nginx 禁止某个IP访问 server { listen 443; root /webroot/; ...
- no.3 base64
tool.chinaz.com的base64有的无法解密: 如:ZXZhbCgkX1BPU1RbcDRuOV96MV96aDNuOV9qMXVfU2gxX0oxM10pNTU2NJC3ODHHYWJI ...
- flask 使用 SQLAlchemy 的两种方式
1. 使用 flask-SQLAlchemy 扩展 # flask-ext-sqlalchemy.py from flask import Flask from flask.ext.sqlalchem ...
- react-native 的微信SDK辅助包,支持微信登录、微信分享、微信支付
微信SDK集成示例,现已完成微信授权登录,之后将陆续包装分享等其他功能. ReactNative高级交流群 127482131 或访问 http://blog.1ygowu.com ReactNat ...
- Android -- 创建数据库到SD卡
SQLite 系统自带的SQLite是通过SQLiteOpenHelper实现的,而SQLiteOpenHelper是将数据库存储到/data/data/包名/databasas,这样做的话在没有ro ...
- [CareerCup] 4.3 Create Minimal Binary Search Tree 创建最小二叉搜索树
4.3 Given a sorted (increasing order) array with unique integer elements, write an algorithm to crea ...
- 教你怎么fan qiang 进国内看视频而不受限制
这一周难得今天闲一点,写日志也不知道写啥,谈爱情?...没得谈.思前想后还是在这儿带给大家点福利吧,主要是针对在国外生活的孩纸们看国内视频总是提示被限制的问题,qq音乐也是. 或许大家有听过f ...
- ASP.NET MVC 5 入门教程 (2) 控制器Controller
文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-controller.html 上一节:ASP.NET MVC ...
- json跨域原理及解决方法
这一篇文章呢,主要是之前一直听别人讲json跨域跨域,但是还是一头雾水,只知其一,于是一怒之下,翻阅各种资料,如果有不正确的地方,劳烦指正一下^_^ 首先,先了解浏览器有一个很重要安全性限制,即为同源 ...