KMP算法小总结 洛谷P3375 【模板】KMP字符串匹配
提问:这里有一个长度为n的字符串str1和长度为m的字符串str2(n > = m),问在str1中str2出现了几次?
如果使用暴力求解,一个一个比较,在n和m都极大的情况下将花费非常多的不必要的计算,那么我们有什么办法来解决呢?
思路:如果我们比较了x个字符都相等,第x + 1个字符不相等,我们没必要回到一开始重新比较,因为前x个字符都已知,只要知道这x个字符能对上str2的前y个字符,再让str1的第x + 1个字符与str2的第y + 1个子符继续比较即可。
- 例题洛谷P3375 【模板】KMP字符串匹配
- 代码:
#include<bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 10; int nex[MAXN]; void fnex(string str) {nex[0] = -1;int ptop = -1;int i = 0;int end = str.size();while(i < end){if(ptop == -1 || str[i] == str[ptop]){nex[++i] = ++ptop;}else{ptop = nex[ptop];}} } int main() {string str1,str2;cin >> str1 >> str2;int end = str1.size();fnex(str2);int i = 0;int ptop = 0;int sum = 0;int end2 = str2.size();while(i < end){if(ptop == end2){cout << i - end2 + 1 << endl;ptop = nex[ptop];}if(ptop == -1 || str1[i] == str2[ptop]){i++;ptop++;}else{ptop = nex[ptop];}}if(ptop == end2){cout << i - end2 + 1 << endl;ptop = nex[ptop];}for(int i = 1;i <= end2;i++){cout << nex[i] << ' ';} }
KMP算法小总结 洛谷P3375 【模板】KMP字符串匹配相关推荐
- sscanf小技巧-洛谷P7911 网络连接
sscanf小技巧-洛谷P7911 网络连接 序言 本题解来源:本蒟蒻上课摸鱼 (别学我) 最近学了一个挺好用的函数--sscanf(),结合洛谷P7911 网络连接讲一下. (点击查看题目) 推荐几 ...
- 洛谷 P3375 【模板】KMP字符串匹配
我这段时间因为字符串太差而被关了起来了(昨晚打cf不会处理字符串现场找大佬模板瞎搞,差点就凉了),所以决定好好补一下字符串的知识QAQ,暂时先学习kmp算法吧~ 题目链接:https://www.lu ...
- (快速幂算法+高精度)洛谷P1045 麦森数
前言 故事的最后,让我们以一道十分经典的题目--<麦森数>来结尾.接受现实吧,总会有我们没准备过的高精度运算出现.我们固然可以提前把高精度的快速幂模板也准备好,但是总会有百密一疏的时候 ...
- 深入理解 操作系统 LRU算法(以洛谷P1540题为例)
LRU算法 LeastRecentlyUsedLeast Recently UsedLeastRecentlyUsed 算法,意为"最近最少使用",这是操作系统内存管理部分重要的一 ...
- 专题·树链剖分【including 洛谷·【模板】树链剖分
初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...
- 深入理解 操作系统 SJF算法(以洛谷P1223题为例)
CPU Scheduling Algorithms 重要的CPU调度算法如下: FCFS Scheduling(First-Come, First-Served) SJF Scheduling(Sho ...
- 洛谷·【模板】点分树 | 震波【including 点分树
初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...
- 图论算法——幻象迷宫(洛谷 P1363)
题目选自洛谷P1363 大概就是说给出一个01迷宫类的地图,按照这个地图来扩展新地图,类似这样 然后问你是不是###可以走无限远. ###那么,我们可以很清晰的意识到,如果可以从点(x,y)出发,达到 ...
- 【后缀数组】洛谷P3809模板题
题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...
最新文章
- 违反计算机网络安全如何处罚,网络信息安全知识:违反治安管理行为的处罚包括()。...
- 给我们宿舍做的游戏--snack
- Win10 KMD驱动模板,应用层向内核传一个字符串,内核把它转成大写
- mysql mycat docker_docker-mycat-mysql
- iOS之网络数据下载和JSON解析
- 4 curses库基垫(pad)处理
- vue实现点击复制文本功能
- Python100天学习教程(Python学习视频_Python学习路线):Day01 初识Python
- C# 给PowerPoint文档设置背景颜色和背景图片
- 【资料】印度数学家拉马努金
- STM32时钟--基于正点原子STM32视频教程
- 大电流输出信号隔离转换模块
- change charset of existed MySQL db
- Python调用R出现“UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb2” 问题
- 007-part5-proveofwork工作量证明
- lumia flash android,Lumia830吃上棉花糖!WP手机刷安卓7.1详细教程
- 北理工计算机2020学硕录取,北京理工大学2020硕士研究生拟录取名单
- HDLbits Exams/2013 q2bfsm verilog fpga
- 从零开始使用 IDEA 开发插件 (一)
- Flick Tab Control