KMP 详解

KMP数组存的是什么

对于一个字符串 b,下标从1开始。

则kmp[i]表示 以i结尾的连续子串 = s的前缀的最大值(等价于前缀最大结尾处)

如何求KMP

假设 i 以前的KMP都被求出来了。

j 表示上一个字符可以成功匹配的长度(等价于下标)

如果b[j+1] != b[i]下一个位置匹配不上(即不能成为前缀)

则,让j = kmp[j] 即成为以j结尾的 连续子串 的 最长前缀 尾部的下标

退出循环后,若还能匹配上则j++(本质是,加上i的贡献。因为j = 0时可能匹配不上)

然后让kmp[i] = j即可。

运用kmp

和求kmp差不多,如果匹配不上,求让a[i]和以j结尾的连续子串的最长前缀匹配。(放宽要求)

算法正确性证明

用哲学的话来说就是,每一次失败都会让我变得更强大。

当匹配不上时,匹配串b至少会前移1位,由指针的思想。O(n)可证。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+7;
int kmp[N];
string a,b;
int j;
int main(){cin>>a>>b;a = " "+a;b = " "+b;for(int i = 2;i < b.size();i++){while(j&&b[j+1] != b[i]){j = kmp[j];}if(b[j+1] == b[i])j++;kmp[i] = j;}j = 0;for(int i = 1;i < a.size();i++){while(j&&a[i] != b[j+1]){j = kmp[j];}if(b[j+1] == a[i])j++;if(j == b.size()-1){cout<<i-(b.size()-1)+1<<endl;j=kmp[j];}}for (int i=1;i < b.size();i++)cout<<kmp[i]<<" ";return 0;
}

 

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

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

相关文章

家里有猫用宠物空气净化器有用吗?希喂、米家、有哈哪款更好

在快节奏的现代生活中&#xff0c;越来越多的人选择宠物作为心灵的慰藉与生活的伴侣。起初&#xff0c;这份陪伴的需求简单而纯粹&#xff0c;但随着日子一天天过去&#xff0c;那份简单的情感逐渐生根发芽&#xff0c;成长为深厚的责任与爱。我在前两年养了两只猫&#xff0c;…

Spring之整合Mybatis底层源码解析

整合核心思路 由很多框架都需要和Spring进行整合&#xff0c;而整合的核心思想就是把其他框架所产生的对象放到Spring容器中&#xff0c;让其成为Bean。 ​ 比如Mybatis&#xff0c;Mybatis框架可以单独使用&#xff0c;而单独使用Mybatis框架就需要用到Mybatis所提供的一些类…

TCP滑动窗口(面试)

TCP三次握手和四次挥手 TCP滑动窗口是什么&#xff1f; 如果传输的数据比较大&#xff0c;需要拆分为多个数据包进行发送。如果TCP 协议需要收到确认应答后&#xff0c;才可以发送下一个数据包。这样的方法效率偏低 为了避免这种情况&#xff0c;TCP使用了滑动窗口。 滑动窗口…

STM32(一)简介

一、stm32简介 1.外设接口 通过程序配置外设来完成功能 2.系统结构 3.引脚定义 4.启动配置 5.最小系统电路

MySQL基础:索引

&#x1f48e;所属专栏&#xff1a;MySQL 1. 索引概述 MySQL中的索引是帮助MySQL高效获取数据的数据结构&#xff0c;可以极大地提高数据库的查询效率&#xff0c;减少数据库的I/O成本&#xff0c;就像书的目录一样&#xff0c;它可以帮助我们快速定位到书中的内容。 优势&…

Word封面对齐技巧

文章目录 前言一、对齐封面1. 点击视图&#xff0c;添加标尺2. 选中文字&#xff0c;右击段落3. 点击制表符&#xff0c;设置制表位位置4. 鼠标点击“&#xff1a;”后面&#xff0c;点击“Tab”键5. 按住“Ctrl”键&#xff0c;选中没对齐的文字&#xff0c;点击“中文板式”&…

SprinBoot+Vue学生选课微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

基于SSM+Vue+MySQL的出租车管理系统

系统背景 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本出租车管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

【启明智显技术分享】探讨CAN总线相关知识以及Model3C 2路CAN的应用

一、 CAN总线相关知识 CAN总线概述 CAN&#xff08;Controller Area Network&#xff09;总线是一种高实时性、高可靠性和灵活性的串行通信协议&#xff0c;广泛应用于汽车和工业控制系统中。它由德国BOSCH公司开发&#xff0c;最高速率可达到1Mbps&#xff0c;具有强大的检错…

DisplayManagerService启动-Android13

DisplayManagerService启动-Android13 1、DisplayManagerService启动1.1 简要时序图 2、DEFAULT_DISPLAY主屏幕添加3、默认屏幕亮度 1、DisplayManagerService启动 1.1 简要时序图 2、DEFAULT_DISPLAY主屏幕添加 3、默认屏幕亮度

AI技术颠覆游戏开发:谷歌DeepMind GameNGen实时生成《DOOM》探秘

引言 近年来&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在图像和视频生成领域取得了巨大突破。然而&#xff0c;谁能想到&#xff0c;这项技术正逐渐渗透进游戏开发领域&#xff0c;且潜力巨大。2023年8月29日&#xff0c;谷歌DeepMind发布了名为《扩散模型是实时…

打造安心宠物乐园:EasyCVR平台赋能猫咖/宠物店的智能视频监控解决方案

随着宠物经济的蓬勃发展&#xff0c;宠物店与猫咖等场所对顾客体验、宠物安全及健康管理的需求日益提升。然而&#xff0c;如何确保这些场所的安全与秩序&#xff0c;同时提升顾客体验&#xff0c;成为了经营者们关注的焦点。引入高效、智能的视频监控方案&#xff0c;不仅能够…

浏览器百科:网页存储篇-如何在Chrome打开localStorage窗格(五)

1.引言 在前面的章节中&#xff0c;我们详细介绍了 localStorage 的基本概念、特性及其常用方法&#xff0c;帮助开发者在网页应用中实现数据的持久化存储。为了更好地管理和调试这些存储的数据&#xff0c;了解如何打开和使用浏览器的 localStorage 窗格是非常重要的。本篇文…

【大模型实战篇】大模型显存资源计算以及GPU如何选择

1. 背景介绍 针对我们今天要讨论的话题&#xff0c;从第一性原则出发&#xff0c;要回答的第一个问题就是&#xff0c;为什么要计算大模型占用的显存资源&#xff1f;一句话概括&#xff1a;显存太小&#xff0c;模型无法运行&#xff1b;显存太大&#xff0c;浪费金钱。所以…

深度学习⑧Meta-Learning Introduction

Motivation 人类学习&#xff1a; 当我们学习新任务时&#xff0c;通常会应用从相关任务中学到的知识。我们通常可以从少量示例中学习&#xff0c;并能够快速适应新任务。我们可以随时刷新或更新自己的知识。 机器学习&#xff1a; 学习仅从少量示例中获得知识&#xff08;少样…

8. GIS数据分析师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

软件测试学习笔记丨Pytest+Allure测试计算器

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/31954 项目要求 3.1 项目简介 计算器是近代人发明的可以进行数字运算的机器。 计算器通过对加法、减法、乘法、除法等功能的运算&#xff0c;将正确的结果展示在屏幕上。 可帮助人们更方便的…

【GD32】---- 使用GD32调试串口并实现printf打印输出

1 复制工程模板 直接复制工程模板里的系统文件和固件库文件到新的工程文件01_USART_Printf 2 新建keil工程 参考上一篇博文&#xff1a;【GD32】---- 移植工程模板及点灯测试 3 编写代码 3.1 创建USART文件 创建一个USART.c文件&#xff0c;放于05_UserDriver文件夹中 …

Rust 赋能前端:PDF 分页/关键词标注/转图片/抽取文本/抽取图片/翻转...

❝ 我从不幻想成功。我只会为了成功努力实践 大家好&#xff0c;我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder ❝ 此篇文章所涉及到的技术有 WebAssembly Mupdf Pdf操作( 分页展示/文本抽离/文本标注/获取超链接/Pdf转图片/翻转/截取) 因为&#xff0c;行文…

新型PyPI攻击技术可能导致超2.2万软件包被劫持

一种针对 Python 软件包索引&#xff08;PyPI&#xff09;注册表的新型供应链攻击技术已在野外被利用&#xff0c;并且目前正试图渗透到下游组织中。 软件供应链安全公司 JFrog 将其代号定为Revival Hijack&#xff0c;并称这种攻击方法可用于劫持 2.2万个现有 PyPI 软件包&am…