KMP 笔记

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。

Border

Border n.边界;边境;国界;边界地区;边疆;镶边;包边;(草坪边等的)狭长花坛

一个字符串的 border 指的是这个字符串的 最长公共前后缀border 的长度不能等于原字符串的长度,例如:
abbabborder 就是ab,因为 ab 既是 abbab 的前缀也是后缀。

Next 表

N e x t i Next_i Nexti 表示以下标 i i i 为结尾的前缀的 border 的长度。

求解 Next 表

如果 t n e x t i + 1 = t i + 1 t_{next_i+1}=t_{i+1} tnexti+1=ti+1 那么 n e x t i + 1 next_{i+1} nexti+1 显然应该等于 n e x t i + 1 next_i+1 nexti+1
如果 t n e x t i + 1 ≠ t i + 1 t_{next_i+1}\not= t_{i+1} tnexti+1=ti+1 前缀next[i]的border,也即前缀next[next[i]],他同时也是前缀next[i]的后缀,而前缀next[i]又是i的后缀,所以前缀next[next[i]]也是前缀i的后缀。

getnext函数模板

void getnechst(string s){int i,j;for(nechst[1]=j=0,i=2;s[i];i++){while(j&&s[i]!=s[j+1]){j=nechst[j];}if(s[i]==s[j+1]){j++;}nechst[i]=j;}
}

题目

1. 模板题 字符串匹配

洛谷 P3375 【模板】KMP

#include<bits/stdc++.h>
using namespace std;
int nechst[1000005],ans;
void getnechst(string s){int i,j;for(nechst[1]=j=0,i=2;s[i];i++){while(j&&s[i]!=s[j+1]){j=nechst[j];}if(s[i]==s[j+1]){j++;}nechst[i]=j;}
}
void kmp(string s,string s1){int i,j;for(j=0,i=1;s1[i];i++){while(j&&s1[i]!=s[j+1]){j=nechst[j];}if(s1[i]==s[j+1]){j++;}if(!s[j+1]){printf("%d\n",i-j+1);j=nechst[j];}}
}
int main(){string s,s1;cin>>s>>s1;s=' '+s;s1=' '+s1;getnechst(s1);kmp(s1,s);for(int i=1;s1[i];i++){printf("%d ",nechst[i]);}return 0;
}

2. 终曲(加强版)

题意

给定三个字符串,从第一个字符串中取出一个子串,要求包含第二个子串和第三个子串,求满足条件的最短子串

思路

利用vector存储子串的匹配位置,再进行二分查找

代码

#include<bits/stdc++.h>
using namespace std;
long long nechst[200005];
vector<long long>vl1,vl2,vr1,vr2;
vector<pair<long long,long long> >rg;
string ans;
long long ansr=0x3f3f3f3f,ansl;
void update(long long l,long long r){if(ansr-ansl>r-l){ansr=r;ansl=l;rg.clear();rg.push_back(make_pair(l,r));}else if(ansr-ansl+1==r-l+1){rg.push_back(make_pair(l,r));}
}
void getnechst(char s[]){int i,j;nechst[i]=0;for(j=0,i=2;s[i];i++){while(j&&s[i]!=s[j+1]){j=nechst[j];}if(s[i]==s[j+1]){j++;}nechst[i]=j;}
}
void getans(string s){if(ans.size()==0||ans>s){ans=s;}
}
void kmp(char s[],char s1[],vector<long long>& vl,vector<long long>& vr){long long n=strlen(s1+1);getnechst(s1);long long i,j,sum=0;for(j=0,i=1;s[i];i++){while(j&&s[i]!=s1[j+1]){j=nechst[j];}if(s[i]==s1[j+1]){j++;}if(!s1[j+1]){vl.push_back(i-n+1);vr.push_back(i);j=nechst[j];}}
}
int main(){char s[200005],s1[105],s2[105];scanf("%s%s%s",s+1,s1+1,s2+1);kmp(s,s1,vl1,vr1);kmp(s,s2,vl2,vr2);long long n=vl1.size(),m=vl2.size();if(n==0||m==0){printf("No");return 0;}for(int i=0;i<n;i++){long long idx=lower_bound(vr2.begin(),vr2.end(),vl1[i])-vr2.begin();if(idx!=m){update(min(vl1[i],vl2[idx]),max(vr1[i],vr2[idx]));}idx--;if(idx>=0){update(min(vl1[i],vl2[idx]),max(vr1[i],vr2[idx]));}}long long len=rg.size();for(int i=0;i<len;i++){char t=s[rg[i].second+1];s[rg[i].second+1]='\0';getans(string(s+rg[i].first));s[rg[i].second+1]=t;}cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/667221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django与MongoDB搭建高效的Web应用

Django&#xff0c;一个高级Python Web框架&#xff0c;以其优雅的设计和强大的功能而闻名&#xff0c;通常与关系型数据库如PostgreSQL, MySQL等结合使用。然而&#xff0c;随着NoSQL数据库的流行&#xff0c;MongoDB这种非关系型数据库因其高性能、高可用性和易扩展性而成为了…

Elasticsearch:集群故障排除和优化综合指南

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;是许多数据驱动应用程序和服务的核心。 它实时处理、分析和存储大量数据的能力使其成为当今快节奏的数字世界中不可或缺的工具。 然而&#xff0c;与任何复杂的系统一样&#xff0c;Elasticsearch 可能会遇到影响其性能和…

Container 命令ctr、crictl 命令

1、 Containerd和Docker的架构区别 Docker vs. Containerd&#xff1a; 2、ctr & crictl的区别 ctr是containerd的一个客户端工具 crictl 是 CRI 兼容的容器运行时命令行接口&#xff0c;可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序 crictl 则直接对…

企业场景中权限认证的深度解析与实战

目录 引言 1. 认证流程的设计 2. RBAC 模型的应用 3. 实现认证与授权的代码示例 3.1 用户实体类 3.2 角色与权限定义 3.3 用户管理类 3.4 登录认证服务 3.5 RBAC权限管理 3.6 应用层示例 结语 引言 在当今数字化时代&#xff0c;企业应用程序不仅需要提供功能丰富的…

Maxwell查询databases表报错:You have an error in your SQL syntax;

报错信息&#xff1a;You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near databases at line 1 报错说明&#xff1a; maxwell初始化后&#xff0c;在其数据库中会有一些表&#xff0c;…

pdf高亮显示

现在前端pdf需求越来越多&#xff0c;比如发票的显示&#xff0c;文件的显示&#xff0c;怎么实现具体步骤百度一下吧&#xff0c;这里不做详细介绍&#xff0c;主要记录下遇到的问题 1.页面pdf已经看到了&#xff0c;但是 iframe.contentWindow.PDFViewerApplication显示unde…

unittest、nosetest、pytest

参考&#xff1a;Choosing The Perfect Python Testing Framework: Unittest Vs. Pytest Vs. UnitTest vs Nose2 vs Pytest FeatureUnittest Pytest Nose2Test DiscoveryYesYesYesFixture SupportYesYesYesParameterizationNoYesYesPlugin EcosystemLimitedExtensiveLimite…

Springboot简单设计两级缓存

两级缓存相比单纯使用远程缓存&#xff0c;具有什么优势呢&#xff1f; 本地缓存基于本地环境的内存&#xff0c;访问速度非常快&#xff0c;对于一些变更频率低、实时性要求低的数据&#xff0c;可以放在本地缓存中&#xff0c;提升访问速度 使用本地缓存能够减少和Redis类的远…

netlink学习

netlink是什么 netlink是Linux内核中的一种进程间通信&#xff08;IPC&#xff09;机制。它允许内核空间与用户空间之间&#xff0c;以及用户空间进程之间进行双向通信。 内核里的很多子系统使用netlink通信&#xff0c;包括网络管理&#xff08;Routing&#xff0c;Netfilt…

项目安全问题及解决方法-----xss处理

XSS 问题的根源在于&#xff0c;原本是让用户传入或输入正常数据的地方&#xff0c;被黑客替换为了 JavaScript 脚本&#xff0c;页面没有经过转义直接显示了这个数据&#xff0c;然后脚本就被 执行了。更严重的是&#xff0c;脚本没有经过转义就保存到了数据库中&#xff0c;随…

【数据结构】实现顺序表

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解顺序表&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一.概念及结构二.接口实现2.1 创建顺序表结构体2.2 初始化顺序表2.3 销毁顺序表2.4 打印顺序表…

Unity 设置鼠标

目录 前言 图标样式的设置 代码控制 编辑器直接修改 图标的显隐 CursorLockMode Cursor.visible 前言 本章主要对鼠标图标样式还有鼠标显隐进行设置 图标样式的设置 代码控制 有时候需要有改变鼠标样式的需求可以使用如下代码 Cursor.SetCursor(this.mouseTexture, Vec…

[word] 怎么删除文字底纹 #职场发展#其他

怎么删除文字底纹 怎么删除文字底纹?我们在录入文字到文档的时候&#xff0c;或者是复制网上内容时&#xff0c;都会带有格式&#xff0c;有时候还会遇到删除不掉的问题。今天给大家分享小技巧&#xff0c;解决你的问题。 1、删除文字底纹 文档自带的底纹&#xff0c;删除技…

C++实现智能指针(涉及知识点:重载运算符,内存泄露的风险)

案例 有时候代码很长&#xff0c;很容易就忘了释放P。导致内存泄露&#xff0c;在程序结束后才会释放。内存泄露的风险 如果代码需要的内存很大&#xff0c;前面的代码用完了new申请的内容不去释放&#xff0c;就会被一直占用着&#xff0c;后面可能不够用了造成程序崩溃。解决…

docker下拉(pull)镜像和生成容器,文章尾部有常用的linux命令

目录 1&#xff1a;docker镜像和容器是什么 2&#xff1a;docker初始化个容器&#xff0c;并进入容器安装mariaDb和httpd 1&#xff1a;用远程工具SecureCRT登录docker 2&#xff1a;拉取CentOS镜像并初始化一个容器 a&#xff1a;拉取镜像&#xff08;这一步可能会有点久&…

linux文件权限备份、恢复-linux文件权限如何备份、恢复-getfacl/setfacl备份恢复文件权限

0、序 在运维这条路上走久了&#xff0c;你能听到或者遇到这样的事情就越多&#xff0c;甚至是你自己干过的&#xff1a; 一个信心满满的运维人员一个不小心&#xff0c;输入 "chmod -R 777 /" 导致一个巨大的悲剧&#xff0c;然后整个部门从上到下被撸一顿。虽然…

牛客周赛 Round 31

D. 思路&#xff1a;使用map构造两个链表。 #include <bits/stdc.h> using namespace std;map<int,int> l,r; int main() {int q;cin>>q;int op-1e9-1;int ed1e91;r[op]ed;l[ed]op;while(q--){int a;cin>>a;if(a1){int x,y;cin>>x>>y;int…

编程笔记 html5cssjs 069 JavaScript Undefined数据类型

编程笔记 html5&css&js 069 JavaScript Undefined数据类型 一、undefined数据类型二、类型运算小结 在JavaScript中&#xff0c;undefined 是一种基本数据类型&#xff0c;它表示一个变量已经声明但未定义&#xff08;即没有赋值&#xff09;或者一个对象属性不存在。 …

MIT6.5830 实验3

前置回顾 在实验2中&#xff0c;完成了增删查改、排序、分组、聚合、连接等基本操作&#xff0c;在已提供 sql 解析器的基础上&#xff0c;能够运行进本的 sql 语句。都是逻辑层的实现&#xff0c;没有涉及物理存储方面的内容。 实验目标 实现最简单的基于锁的transaction&am…

MicroPython ESP32开发:通过寄存器直接访问外围设备

可以通过直接读写寄存器来控制 ESP32 的外设。这就需要阅读数据手册&#xff0c;了解要使用哪些寄存器以及要写入哪些值。下面的示例展示了如何打开和更改 MCPWM0 外设的预分频器。 from micropython import const from machine import mem32# Define the register addresses …