蓝桥杯倒计时 41天 - KMP 算法

KMP算法

KMP算法是一种字符串匹配算法,用于匹配模式串P在文本串S中出现的所有位置。
例如S=“ababac,P=“aba”,那么出现的所有位置是13。
在初学KMP时,我们只需要记住和学会使用模板即可,对其原理只需简单理解,不要过度深究,避免把自己绕进去,可以课后自己慢慢去画图理解。
KMP算法将原本O(n2)的字符串匹配算法优化到了O(n).其精髓在于next数组,next数组表示此时模式串下标失配时应该移动到的位置,也表示最长的相同真前后缀的长度。
在这里插入图片描述
例如P=“ababac”,S=“abababac”。
当匹配到i=6,j=5,P[i+1]!=S[i]时,j不会移动到1重新开始匹配,而是移动到nex[j]=3继续匹配,
则接下来i=6,j=3,有P[j+1]=S[i],成功匹配,则i,j继续后移,直到i=8.j=6完成一次匹配,则P在S中第一次出现的位置为j-i+1=3。

计算next数组(next数组仅与模式串P有关)的方式就是用P自己去匹配自己,大家只需要掌握模板即可,暂时不要深究其原理。

char s[N],p[N];
int nex[M];
int n = strlen(s+1),m=strlen(p+1);//字符串下标从 1 开始
nex[0]=nex[1]=0;
for(int i=2,j=0;i<=m;++i){while(j&&p[i]!=p[j+1])j=nex[j];if(p[i]==p[j+1])j++;//从 while 出来后要么 j=0,要么 p[i]==p[j+1],如果匹配成果,则 j 后移nex[i]=j;//如果匹配失败就回到 j,因为此时 p[1~j]=p[i-j+1~j]或 j=0(回到最初的地方开始匹配)
}

通过 next 数组匹配

for(int i=1,j=0;i<=n;i++)
{while(j&&s[i]!=p[j+1])j=nex[j];if(s[i]==p[j+1])j++;if(j==m)//成功匹配一次
}

斤斤计较的小Z

在这里插入图片描述
思路:KMP 算法模板,不知道为啥结果不对

#include<bits/stdc++.h>
using namespace std;
const int N =20,M=20;
char s[N],p[M];
int nex[M];int main(){scanf("%s\n%s",p+1,s+1);int n=strlen(s+1),m=strlen(p+1);nex[0]=nex[1]=0;for(int i=2,j=0;i<=m;i++){while(j&&p[j+1]!=p[i])j=nex[j];if(p[j+1]==p[i])j++;nex[i]=j;}int res=0;for(int i=1,j=0;i<=n;i++){while(j&&p[j+1]!=s[i])j=nex[j];if(p[j+1]==s[i])j++;if(j==m)res++;}cout<<res<<'\n';return 0;
}

boarder

在这里插入图片描述
思路:利用 KMP 求整个串的最长真前后缀,len-nex[len]就是整个串的循环节,len 能整除循环节就是答案,不能就是 1。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char p[N];
int nex[N];
int main( ){scanf("%s",p+1);unsigned long m=strlen(p+1);nex[0]=nex[1]=0;for(int i=2,j=0;i<=m;i++){while(j&&p[i]!=p[j+1])j=nex[j];if(p[i]==p[j+1])j++;nex[i]=j;}int len=m-nex[m];if(m%len==0){cout<<m/len<<endl;}else{cout<<1<<endl;}return 0;
}

幸运字符串

在这里插入图片描述
在这里插入图片描述
思路:求 nex 数组,找最大值就是答案

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int n;
char p[N];
int nex[N];
int main( ){cin>>n;scanf("%s",p+1);unsigned long m=strlen(p+1);for(int i=2,j=0;i<=m;i++){while(j&&p[i]!=p[j+1])j=nex[j];if(p[i]==p[j+1])j++;nex[i]=j;}int ans=0;for(int i=1;i<=m;i++)ans=max(ans,nex[i]);cout<<ans<<endl;return 0;
}

你也喜欢幸运字符串吗?

在这里插入图片描述
思路:动态规划+KMP,不会。
在这里插入图片描述

#include <bits/stdc++.h>
#define ll long long
#define PI 3.1415926
using namespace std;
typedef pair<int, int> vt;
typedef pair<vt, vt> PII;
const int N = 1e6 + 10;
const int M = 2 * N;
const int mod = 998244353;
const ll INF = 0x3f3f3f3f3f3f3f3f;int ne[N];
string s;
int n;void solve()
{cin >> n;cin >> s;memset(ne, 0, sizeof ne);s = " " + s;for (int i = 2, j = 0; i <= n; i++){while (j && s[i] != s[j + 1])j = ne[j];if (s[i] == s[j + 1])j++;ne[i] = j;}vector<ll> f(n + 5);for (int i = 1; i <= n; i++)f[i] = 1;for (int i = n; i >= 1; i--)f[ne[i]] += f[i];ll ans = 0;// for(int i=1;i<=n;i++)cout<<f[i]<<endl;for (int i = 1; i <= n; i++){if (ne[i] != 0)ans += f[ne[i]];}cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);/*多组案例初始化*/// int t;cin>>t;while(t--)solve();
}

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

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

相关文章

用Socks5代理游戏,绕过“网络海关”去探险

1. 出海大冒险的开始 在游戏世界&#xff0c;就像在现实生活中一样&#xff0c;有时我们需要越过海洋去探索未知的世界。但是&#xff0c;网络上也有一些“海关”&#xff0c;限制我们访问某些网站或游戏服务器。这就是我们今天要克服的挑战&#xff01; 2. Socks5代理&#xf…

Django 官网项目 四

内容&#xff1a; 利用HTTP的post方法&#xff0c;更改数据并显示。 创建detail.html文件&#xff0c;来创建POST内容 修改应用的视图文件views.py&#xff0c;vote方法 修改应用的视图文件views.py&#xff0c;results方法。 创建results.html文件。 结果&#xff1a;单…

.NET开源功能强大的串口调试工具

前言 今天大姚给大家分享一款.NET开源的、功能强大的串口调试工具&#xff1a;LLCOM。 工具介绍 LLCOM是一个.NET开源的、功能强大的串口调试工具。支持Lua自动化处理、串口调试、串口监听、串口曲线、TCP测试、MQTT测试、编码转换、乱码恢复等功能。 功能列表 收发日志清晰…

将SpringBoot项目改造成solon项目

solon项目介绍 官网 Java “生态型”应用开发框架&#xff1a;更快、更小、更简单。 启动快 5 &#xff5e; 10 倍&#xff1b;并发高 2&#xff5e; 3 倍&#xff1b; 内存省 1/3 ~ 1/2&#xff1b;打包缩到 1/2 ~ 1/10&#xff1b;同时支持 java8, java11, java17, java21&a…

数据结构学习(二)字符串

字符串 1. 概念 字符串就是特殊的字符数组&#xff0c;字符数组末尾的元素为 ‘\0’。和数组一样可以使用arr[i]或*(arri)来访问元素。 无论是用数组保存字符串&#xff08;如&#xff1a;char arr[] "Hello&#xff0c;World";&#xff09;&#xff0c;还是用指针…

汉诺塔问题(c++题解)

题目描述 1、一次只许移动一个盘 2、任何时候、任何柱子不允许把大盘放在小盘上面。 3、可使用任一一根立柱暂存圆盘。 问&#xff1a;如何使用最少步数实现n个盘子的移动&#xff1f;打印出具体移动方案。 输入格式 一行一个数n, 1< n < 18 输出格式 输出若干行…

关于HTML5表单验证的方法教程

简介 HTML5表单验证是一种在客户端对用户输入进行验证的方法&#xff0c;可以有效地减少对于服务器端验证的依赖。通过使用HTML5表单验证&#xff0c;可以为用户提供实时的错误提示和更好的用户体验。本教程将介绍如何在HTML5中使用各种验证属性和技术来实现表单验证。 基本表…

flynn发布服务小结

背景 flynn是一个基于容器的paas平台&#xff0c;可以快速的发布运行新的应用&#xff0c;用户只需要提交代码到git上&#xff0c;flynn就会基于提交的代码进行发布和部署&#xff0c;本文就简单看下flynn发布部署的流程 flynn发布服务 1.首先flynn会基于用户的web代码构建一…

Nature 研究亮点(Volume 626 Issue 8001, 29 February 2024)

文章目录 激光雕刻肥皂膜卵细胞的回收系统巴斯克语的起源产后抑郁症的治疗 激光雕刻肥皂膜 研究者&#xff1a;Haitao Xu 和 Yu Zhao&#xff0c;清华大学&#xff0c;北京。 发现&#xff1a;在特定条件下&#xff0c;可以使用激光在肥皂膜上进行雕刻。肥皂膜由洗涤剂分子&am…

AJAX 学习笔记(Day1)

「写在前面」 本文为黑马程序员 AJAX 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 AJAX 入门 1.1 AJAX 概念和 axios 使用 1.2 认识 URL 1.3 URL 查询参数 1.4 常用请求方法和数据提交 1.5 HT…

H264的打包,nal,es,pes,pts,dts,ps,ts

编码层次 视频编码层&#xff1a;预测、变换、量化、熵编码等操作slice层&#xff1a;将视频帧分割成若干个编码单元&#xff0c;包含一定数量的宏块&#xff0c;提高编解码的并行性和容错性。NAL层&#xff1a;提升对网络传输和数据存储的亲和性 视频编码层 基准-Baseline …

云计算与大数据课程笔记(一)云计算背景与介绍

如何实现一个简易搜索引擎&#xff1f; 实现一个简易的搜索引擎可以分为几个基本步骤&#xff1a;数据收集&#xff08;爬虫&#xff09;、数据处理&#xff08;索引&#xff09;、查询处理和结果呈现。下面是一个概括的实现流程&#xff1a; 1. 数据收集&#xff08;爬虫&am…

Java实战:Spring Boot项目中如何利用Redis实现用户IP接口限流

引言 在高并发的Web应用中&#xff0c;接口限流是一项至关重要的技术手段&#xff0c;它有助于保护系统资源&#xff0c;防止因瞬间流量高峰导致服务崩溃。本文将深入探讨如何在Spring Boot项目中借助Redis实现用户IP级别的接口限流策略&#xff0c;通过具体的代码示例&#x…

大数据概述

学习大数据有什么用&#xff1f; 2010年&#xff1a;大数据技术体系开始在国内火热 2015年&#xff1a;国务院印发《促进大数据发展行动纲要》 2016年&#xff1a;发改委发布关于组织实施促进大数据发展重大工程的通知 2017年&#xff1a;工信部印发大数据产业规划(2016-20…

Linux运维_Bash脚本_构建安装Meson-1.0.1和Ninja-1.11.1

Linux运维_Bash脚本_构建安装Meson-1.0.1和Ninja-1.11.1 Bash (Bourne Again Shell) 是一个解释器&#xff0c;负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件&#xff0c;并于 1989 年发布的免费软件&#xff0c;作为 Sh (Bourne Shell) 的替代品。 您…

Nginx高级技巧:实现负载均衡和反向代理

文章目录 Nginx概述Nginx作用正向代理反向代理负载均衡动静分离 Nginx的安装 -->Docker3.1 安装Nginx3.2 Nginx的配置文件3.3 修改docker-compose文件 Nginx源码安装nginx常用命令nginx配置文件配置文件位置配置文件结构详情 Nginx的反向代理【重点】基于Nginx实现反向代理4…

C语言冒泡排序(高级版)

目录: 冒泡排序的原理 主函数 "冒泡排序函数" 比较函数 交换函数 最终输出 完整代码 冒泡排序的原理: 冒泡排序的原理是&#xff1a;从左到右&#xff0c;相邻元素进行比较。每次比较一轮&#xff0c;就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右…

Windows上构建一个和Linux类似的Terminal

preview 目的是在Windows上构建一个和Linux类似的Terminal&#xff0c;让Windows炼丹和Linux一样舒适&#xff0c;同是让Terminal取代Xshell完成远程链接。 预览如下图 在Linux下我们使用zsh和oh-my-zsh结合&#xff0c;Windows下我们使用powershell7和oh-my-posh结合。 前提…

Vue 前端开发 v-for和v-if两个指令不能混合使用

原由&#xff1a; 在进行项目开发的时候因为在一个标签上同时使用了v-for和v-if两个指令导致的报错。 提示错误&#xff1a;The undefined variable inside v-for directive should be replaced with a computed property that returns filtered array instead. You should no…

nginx------------缓存功能 ip透传 负载均衡 (六)

一、http 协议反向代理 &#xff08;一&#xff09;反向代理示例:缓存功能 缓存功能可以加速访问&#xff0c;如果没有缓存关闭后端服务器后&#xff0c;图片将无法访问&#xff0c;缓存功能默认关闭&#xff0c;需要开启。 ​ proxy_cache zone_name | off; 默认off #指明调…