大家好,今天是2025年8月31日,上一期我给大家分享了 KMP 算法的相关知识,今天我来带领大家学习4道 KMP 相关的算法题

在学习算法题之前,还是希望大家能够要先学会 KMP 算法(可以参考这篇文章:KMP 算法)

当然,如果你是高手的话,也可以自己先尝试一下解决下面的四道问题,检验一下你的 KMP 算法的掌握程度。

那么,废话不多收,我们开启今天的学习!!!

题目一:剪花布条

题目链接:剪花布条

【题目描述】

【算法原理】

这道题一眼就可以看出是字符串匹配的问题,暴力解法当然是拿着模式串去主串的每一个位置依次进行匹配,时间复杂度较高,但是这道题目数据范围比较小,应该也是可以通过~~

这种字符串匹配的问题,我们可以尝试使用 KMP 算法进行解决。

但不同于 KMP 算法模板题的是,这道题目找到所有匹配的位置之后,还要从左到右进行判断筛选,不能重叠。这个只需要额外判断匹配位置之间的距离是否大于模式串的长度就可以了。

注意:可见的 ASCII 字符是包括 ‘#’ 的,因此我们用 ‘ ’(空格)来链接模式串和主串。

【代码实现】

#include <iostream>using namespace std;const int N = 2010; // 注意要开成两倍 string s, t;
int n, m;
int pi[N];int main()
{while(cin >> s >> t){int ret = 0; n = s.size(); m = t.size();s = ' ' + t + ' ' + s;for(int i = 2; i <= m + n + 1; i++){int j = pi[i - 1];while(j && s[i] != s[j + 1]) j = pi[j];if(s[i] == s[j + 1]) j++;pi[i] = j;}for(int i = m + 1; i <= m + n + 1; i++){if(pi[i] == m){ret++;i += m - 1; // 出去以后还会 ++ 一次 // 防重叠 }}cout << ret << endl;}return 0;
}

题目二:Seek the Name

题目链接:Seek the Name

【题目描述】

【算法原理】

前缀函数的小用途~~

border 的 border 还是 border

题目要求求出字符串所有 border 的长度,我们可以先求出最长的 border 的长度,再依次去找短的 border。这道题目就是一个简单的求前缀函数的问题~~

用数组存储所有 border 的长度,最后再逆序输出。(有一种数组模拟栈的感觉)

最后不要忘记输出整个字符串的长度~~,求 border 不会考虑,但是本题是要考虑的。

【代码实现】

#include <iostream>using namespace std;const int N = 4e5 + 10;string s;
int n, pi[N];
int ret[N], top;int main()
{while(cin >> s){top = 0;n = s.size();s = ' ' + s;for(int i = 2; i <= n; i++){int j = pi[i - 1];while(j && s[i] != s[j + 1]) j = pi[j];if(s[i] == s[j + 1]) j++;pi[i] = j;}for(int i = pi[n]; i; i = pi[i]) ret[++top] = i;for(int i = top; i >= 1; i--) cout << ret[i] << " ";cout << n << endl;}return 0;
} 

题目三:ABB

题目链接 ABB

【题目描述】

【算法原理】

对于回文串相关的问题,可以使用 malache 算法来解决,但是我们这个专题是 KMP,因此我们尝试使用 KMP 算法来解决这个问题。

题目转化:这道题实质上是求给定字符串的最长回文后缀的长度 len,n - len 就是最终结果。

因为题目要求你只能从字符串的末端去补充字符,所以回文后缀的长度越长,你要补充的字符数量就越少。

所以我们只需要解决求出一个字符串的最长回文后缀的长度就可以了~~

如何解决这个问题呢???

我们发现:如果将回文串逆序,应该和原始的字符串相同。因此,我们可以将字符串逆序之后拼接到原始字符串的前面,在中间加一个 ‘#’ 连接。

接下来,我们只需要求出新字符串最长的 border 长度 pi,再用 n - pi 就解决了。

【代码实现】

#include <iostream>
#include <algorithm>using namespace std;const int N = 8e5 + 10; // 开两倍 string s, t;
int n;
int pi[N];int main()
{cin >> n >> s;t = s;reverse(t.begin(), t.end());s = ' ' + t + '#' + s;for(int i = 2; i <= n + n + 1; i++){int j = pi[i - 1];while(j && s[i] != s[j + 1]) j = pi[j];if(s[i] == s[j + 1]) j++;pi[i] = j;}cout << n - pi[n + n + 1] << endl;return 0;
}

题目四:Censoring S

题目链接:Censoring S

【题目描述】

【算法原理】

KMP 算法 + 栈(存下标)

对于这种类似”消消乐“的玩法,我们很容易想到 “栈” 这样的一个数据结构

对于之前求前缀函数的模板,我们优先考虑使用【1,i - 1】的 border 来更新 【1,i】的 border

但是这道题目涉及消除的操作,因此我们不能使用【1,i - 1】的 border 来更新 【1,i】的 border(有可能前面的字符都消没了)

而是使用栈顶下标的元素来更新【1,i】的 border。

【代码实现】

#include <iostream>using namespace std;const int N = 2e6 + 10;string s, t;
int n, m, pi[N];
int st[N], top; // 用数组模拟栈 int main()
{cin >> s >> t;n = s.size(), m = t.size();s = ' ' + t + ' ' + s;// pi[1] = 0;st[++top] = 1;for(int i = 2; i <= n + m + 1; i++){int j = pi[st[top]];while(j && s[i] != s[j + 1]) j = pi[j];if(s[i] == s[j + 1]) j++;pi[i] = j;st[++top] = i;if(j == m){for(int k = 0; k < m; k++) top--;}}for(int i = m + 2; i <= top; i++) cout << s[st[i]];return 0;
}

好的,今天的分享到这里就结束了,谢谢大家!!!

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

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

相关文章

张柏芝亮相林家谦演唱会 再次演绎《任何天气》

近日&#xff0c;张柏芝作为特别嘉宾亮相歌手林家谦演唱会。当天&#xff0c;张柏芝身着一袭浅米色蕾丝裙装&#xff0c;轻盈面料搭配层叠设计&#xff0c;行走间裙摆微扬&#xff0c;温柔气质满溢&#xff0c;为舞台增添了一抹温柔亮色。舞台上&#xff0c;张柏芝接连演绎《任…

Android 权限申请现代化指南

Android 权限申请现代化指南 一、核心概念&#xff1a;权限分类 Android 将权限分为三大类&#xff0c;申请方式各不相同&#xff1a; 普通权限 (Normal Permissions)范围&#xff1a;涉及应用沙盒外部但对用户隐私或设备操作风险极低的操作。示例&#xff1a;网络访问 (IN…

大话 IOT 技术(3) -- MQTT篇

文章目录前言前情提要MQTT介绍组成万恶的appmqtt服务端伪代码实现开源的力量后话当你迷茫的时候&#xff0c;请点击 物联网目录大纲 快速查看前面的技术文章&#xff0c;相信你总能找到前行的方向 前言 本篇将开始讲述IOT技术的一个重点&#xff0c;mqtt协议。 我发现有一个…

大语言模型生成的“超龄劳动者权益保障制度系统化完善建议(修订版)”

大纲 │ ├── 一、基于征求意见稿现状的评估 │ ├── 制度意义&#xff1a;25条暂行规定首次明确权益范围&#xff0c;提供法律依据 │ └── 关键缺陷 │ ├── 法律定位不明确 │ ├── 社保衔接不足 │ └── 实施机制不完善 │ ├── 二、法…

【UnityAS】Unity Android Studio 联合开发快速入门:环境配置、AAR 集成与双向调用教程

这是一篇2021年的存档&#xff0c;使用Unity2020版本。 至今&#xff0c;Unity与AS很多通讯方式也是基于此衍生。 作为Unity与AS联合开发的受益者&#xff0c;难得掏出自己的饭碗&#xff0c;诸君共享&#xff01; Unity & Android Studio 联合开发快速入门 ——Unity与AS…

前后端联合实现多个文件上传

1、前端 Vue3CommonApplyBasicInfoForm.vue<script setup lang"ts" name"CommonApplyBasicInfoForm"> ...... // 文件输入实例对象 const fileInputRef ref<HTMLInputElement | null>(null); // 选择文件列表 const selectedFiles ref<Fi…

软考高级--系统架构设计师--综合知识真题解析

系列文章目录 文章目录系列文章目录一、2019年真题二、2020年真题三、2021年真题四、2022年真题总结一、2019年真题 二、2020年真题 三、2021年真题 四、2022年真题 总结

“帕萨特B5钳盘式制动器结构设计三维PROE模型7张CAD图纸PDF图“

摘 要本文首先对汽车制动器原理和对各种各样的制动器进行分析,详细地阐述了各类制动器的结构,工作原理和优缺点。再根据轿车的车型和结构选择了适合的方案。根据市场上同系列车型的车大多数是滑钳盘式制动器,而且滑动钳式盘式制动器结构简单,性能居中,设计规范,所以我选择滑动…

SQL注入6----(其他注入手法)

一.前言 本章节来介绍一下其他的注入手法&#xff0c;也就是非常规注入手法&#xff0c;来和大家介绍一下 二.加密注入 前端提交的有些数据是加密之后&#xff0c;到了后台在解密&#xff0c;然后再进行数据库查询等相关操作的&#xff0c;那么既然如 此我们也应该将注入语句…

visual studio2022 配置 PCL 1.13.1

PCL库下载 下载链接&#xff1a; https://github.com/PointCloudLibrary/pcl/releases 下载这两个。 PCL库安装 运行.exe文件进行安装。 环境变量勾第二个&#xff08;其实无所谓&#xff0c;反正还要添加别的环境变量&#xff0c;这里没选之后加也一样&#xff09;。 安装…

金融学-货币理论

前言 前面学习了什么是货币供给&#xff0c;货币供给的决定以及联邦储备体系在货币供给中所起的作用。现在我们要开始探讨经济中货币供给在决定价格水平与全部商品和劳务(总供给)中的作用。关于货币对经济影响的研究&#xff0c;称为货币理论(monetarythe-ory) 货币数量论 古典…

Visio绘图——给多边形增加连接线

每次在画项目框图和各类爪图的时候&#xff0c;连接线是最烦人的&#xff0c;虽然选择的是折线&#xff0c;单往往事与愿违。 下面就记录一下&#xff0c;如何查找各类连接线。 1、先展开左侧菜单栏&#xff0c;点击如下所示的“&#xff1e;”2、在展开的界面&#xff0c;再次…

【开题答辩全过程】以 付费自习室系统小程序为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

开疆智能Profinet转EtherCAT网关连接TR-Electronic传感器配置案例

本案例是通过开疆智能研发的Profinet转EtherCAT网关将传感器数据传送到PLC&#xff0c;由于两边设备采用协议不同&#xff0c;故而使用网关进行转换。网关配置&#xff1a;打开网关配置软件“EtherCAT Manager”并新建项目。根据不通网关型号也可选择ModbusTCP&#xff0c;Ethe…

VSCode中使用Markdown

文章目录1. 背景2. 安装插件3. 基础写作与预览4. 生成PDF文档5. 插入代码6. 插入图片7. 小结1. 背景 编程技术人员&#xff0c;很多人写作习惯用Markdown格式吧。 首先Markdown很简单&#xff0c;第二它的层次结构特别清晰&#xff0c;再然后它对嵌入图片、代码的支持很优秀。…

2024全栈技术栈选型指南

前后端技术栈选择现代前后端技术栈选择需兼顾市场需求与个人兴趣。前端领域React、Vue、Angular形成三足鼎立&#xff0c;React在大型项目占比达58%&#xff0c;Vue在小中型企业更受欢迎。TypeScript采用率年增长25%&#xff0c;已成为工程化标配。后端技术呈现多元化趋势&…

Spring Boot 项目文件上传安全与优化:OSS、MinIO、Nginx 分片上传实战

在实际的 Web 项目中&#xff0c;文件上传是一个常见需求&#xff1a;用户上传头像、企业后台上传资料、视频平台上传大文件等等。然而&#xff0c;文件上传也是最容易引发安全风险的功能之一&#xff0c;比如恶意脚本上传、木马文件伪装、存储空间消耗攻击。同时&#xff0c;当…

智能安防:以AI重塑安全新边界

传统安防依赖人力监控与简单报警&#xff0c;效率低下且易遗漏风险。随着人工智能、物联网及大数据技术的融合&#xff0c;智能安防正重新定义安全管理的范式&#xff0c;从被动响应转向主动预警&#xff0c;成为智慧城市与数字化生活的重要基石。智能安防的核心是人工智能视觉…

【AI】【强化学习】强化学习算法总结、资料汇总、个人理解

前言&#xff1a;自己学习西湖大学赵老师的课、youtube系列的课程相关比较重要的内容&#xff0c;后续不断再进行完善。 YouTube Serrano.academy rlhf讲的很好 合集最后一个没看 强化学习第四章 police没一步需要无穷&#xff0c;值迭代只需要一步 收敛不一样 值迭代:原因在于…

一键掌控三线资源:极简 Shell 脚本实现 CPU·磁盘·内存可视化巡检

目录 前言 数值型 for 循环 语法格式 示例&#xff1a;打印 1 到 5 示例&#xff1a;打印5次Hello World 示例&#xff1a;计算 1 到 100 的累加和 遍历型 for 循环 语法格式 示例&#xff1a;遍历字符串列表 示例&#xff1a;遍历数组 示例&#xff1a;遍历文件列表…