[模板] KMP算法/Border
KMP 算法
KMP (Knuth-Morris-Pratt) 算法是一种在线性时间内匹配文本串和模式串的算法.
称字符串的 Border 集合为
\]
称字符串 \(S\) 的最长 Border 为 \(fail(S)\), 或者 \(next(S)\). 容易发现递归枚举 \(fail(S), fail(fail(S)), \dotsc\) 可以得到 \(S\) 的 \(\operatorname {Border}\) 集合.
把每个位置 \(p\) 连向 \(fail(p)\) (包括 \(0\) 号节点), 可以得到一棵以 \(0\) 号节点为根的树, 称为 Border tree.
KMP 算法可以在线性时间内得到字符串 \(S\) 每个前缀的 \(fail\) 函数, 并可以利用它进行字符串的匹配.
求 Border 和匹配
int n,m;
char s1[nsz],s2[nsz];
int nxt[nsz];
void getnext(char *s,int n){
int l=0; //l means the length of prefix matched
nxt[1]=0;
rep(i,2,n){
while(l&&s[l+1]!=s[i])l=nxt[l];
if(s[l+1]==s[i])++l;
nxt[i]=l;
}
}
int pl[nsz],pp=0;
void match(){ //s2->s1
pp=0;
int l=0; // the length of prefix of m matched
rep(i,1,m){
while(l&&s2[l+1]!=s1[i])l=nxt[l];
if(s2[l+1]==s1[i])++l;
if(l==n){pl[++pp]=i-l+1;l=nxt[l];}
}
}
[模板] KMP算法/Border的更多相关文章
- [模板]KMP算法
昨天晚上一直在调KMP(模板传送门),因为先学了hash[关于hash的内容会在随后进行更(gu)新(gu)]于是想从1开始读...结果写出来之后一直死循环,最后我还是改回从0读入字符串了. [预先定 ...
- 算法模板——KMP字符串匹配
功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置 原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单 ...
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- KMP算法自我理解 和 模板
字符串 abcd abc abcd abc 匹配串 cdabcd 匹配串的 next 0 0 0 0 1 2: 开始匹配 abcd abc abcd abc cd abc d a,d 匹配失 ...
- KMP算法(——模板习题与总结)
KMP算法是一种改进的模式匹配算法,相比于朴素的模式匹配算法效率更高.下面讲解KMP算法的基本思想与实现. 先来看一下朴素模式匹配算法的基本思想与实现. 朴素模式匹配算法的基本思想是匹配过程中如果该位 ...
- KMP算法模板&&扩展
很不错的学习链接:https://blog.csdn.net/v_july_v/article/details/7041827 具体思路就看上面的链接就行了,这里只放几个常用的模板 问题描述: 给出字 ...
- hdu 1711 KMP算法模板题
题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...
- KMP算法(推导方法及模板)
介绍 克努斯-莫里斯-普拉特算法Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信 ...
- KMP算法解题模板(更新)
/* kmp算法的主要作用在于对next数组的运用,所以这里只给出next数组的模板 性质1:对于每一个长度len的子串,该子串的最小循环节为len-next[len] 性质2:kmp的next不断向 ...
随机推荐
- Jira和confluence备份
参考: https://www.cnblogs.com/kevingrace/p/8862531.html JIRA备份和还原: #Jira默认会打开自动备份的功能,备份路径为: /data/atl ...
- 为什么 ConcurrentHashMap 的读操作不需要加锁?
现在人工智能非常火爆,很多朋友都想学,但是一般的教程都是为博硕生准备的,太难看懂了.最近发现了一个非常适合小白入门的教程,不仅通俗易懂而且还很风趣幽默.所以忍不住分享一下给大家 ConcurrentH ...
- swift MT报文解析处理
swift 官方资料:https://www2.swift.com/knowledgecentre/publications/us5mc_20180720/2.0?topic=alec.htm#gen ...
- C++练习 | 单向链表类模板(包含类模板中静态变量初始化格式)
#include <iostream> #include <string> using namespace std; template <class T> clas ...
- Robot Framework(一)安装笔记
参考网址:https://www.cnblogs.com/yinrw/p/5837828.html因为自己安装了py,网上教程都是统一安装py2.7开始的. 所以这里总结下安装笔记:cmd命令界面进行 ...
- linux增加swap大小
参考自:https://blog.csdn.net/ssrmygod/article/details/70157716 我在centos6.5上照着操作成功了首先查一下目前swap的大小: [root ...
- spring boot jpa criteria api是如何生成JPQL的
当我们使用entityManager.createQuery(query)时,我们发现entityManager的注入对象如下: 也就是它:org.springframework.orm.jpa.Lo ...
- 彻底了解websocket原理
一.websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1 ...
- 关于ES5中的prototype与ES6中class继承的比较
ES5:继承: 1.ES5:继承 通过原型链实现继承.子类的prototype为父类对象的一个实例,因此子类的原型对象包含指向父类的原型对象的指针,父类的实例属性成为子类原型属性 2.ES6 的继承 ...
- react 不同环境配置不同域名
npm eject 先将配置文件暴露出来 将scripts中的build文件复制一份,改名为你需要的名字 将其中的 process.env.NODE_ENV 赋值为你需要的环境 在package.js ...