【模板】KMP字符串匹配
来源:互联网 发布:ubuntu 阿里源 gpg 编辑:程序博客网 时间:2024/05/29 08:46
- 基本介绍
- 模板题目
- 代码实现
基本介绍
KMP(Knuth-Morris-Pratt算法)是最常用的字符串匹配算法之一。它以三个发明者命名。
KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是用一个next数组,记录模式串的局部匹配信息。所以这个next数组也就是算法的核心,网上有很多博客都在写,但是个人感觉都不好理解…
这个算法的模板是从Zheng.HT那里拿(偷)来的 他的博客里面链接了两个大佬的博客 可以学习
Zheng.HT
再附一个歪果仁写的博客 可以在线翻译一句一句看 写的很通俗 虽然没有代码 但可以快速理解next的实现
Jake.Boxer
模板题目
题目描述
如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。
为了减少骗分的情况,接下来还要输出子串的前缀数组next。如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。
输入输出格式
输入格式:
第一行为一个字符串,即为s1(仅包含大写字母)
第二行为一个字符串,即为s2(仅包含大写字母)
输出格式:
若干行,每行包含一个整数,表示s2在s1中出现的位置
接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值。
输入输出样例
输入样例:
ABABABC
ABA
输出样例:
1
3
0 0 1
代码实现
=============================================================KMP板子来自Zheng.HT=============================================================#include<iostream>#include<cctype>#include<cstdio>#include<cstring>#include<string>using namespace std;#define LL long long#define in =READ()const int size = 1000000 + 50;LL next[size];char t[size],p[size];LL lent,lenp;inline LL READ(){ LL num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-'){ f=-1; } ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-'0'; ch=getchar(); } return num*f;}inline void MAKE_NEXT(){ int k=0; for(int i=1;i<lenp;i++){ while(k&&p[i]!=p[k]){ k=next[k-1]; } if(p[i]==p[k]){ k++; } next[i]=k; }}inline LL KMP(){ int k=0; MAKE_NEXT(); for(int i=0;i<lent;i++){ while(k&&p[k]!=t[i]){ k=next[k-1]; } if(p[k]==t[i]){ k++; } if(k==lenp){ printf("%d\n",i-lenp+2); } }}int main(){ scanf("%s",t); scanf("%s",p); lent=strlen(t); lenp=strlen(p); KMP(); for(int i=0;i<lenp;i++){ printf("%d ",next[i]); }}//COYG
阅读全文
0 0
- 【字符串】KMP匹配模板
- 【模板】KMP字符串匹配
- [模板]-KMP字符串匹配
- 字符串匹配 KMP算法 模板
- [kmp] hdu1711 字符串匹配模板
- 字符串匹配(KMP模板题)
- 数据结构-字符串匹配kmp模板
- P3375 【模板】KMP字符串匹配
- 字符串匹配 KMP(模板)
- P3375 【模板】KMP字符串匹配
- kmp-洛谷P3375 【模板】KMP字符串匹配
- poj 3461(kmp字符串匹配模板)
- kmp字符串匹配模板(c++)
- KMP字符串匹配算法模板代码
- 洛谷 P3375 【模板】KMP字符串匹配
- 洛谷 P3375 【模板】KMP字符串匹配
- 洛谷P3375 【模板】KMP字符串匹配
- 洛谷P3375 【模板】KMP字符串匹配
- Maven学习之入门二
- JZOJ 3754 【NOI2014】魔法森林
- [bzoj2301]problem b 莫比乌斯反演
- 第k大问题各类变种小结
- python爬虫之正则表达式
- 【模板】KMP字符串匹配
- 【ShawnZhang】这次什么都不带你看了—— 分隔符
- apache 下配置网站单一入口
- 操作系统(6)
- 给初学者的 RxJava2.0 教程 (八)
- xcode卡死乱象
- faster rcnn训练自己地数据时遇到地问题
- React Native 在原生项目中集成之坑点总结
- 多个表单在一个页面上的视图分离处理