蓝桥杯倒计时 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();
}
相关文章:
蓝桥杯倒计时 41天 - KMP 算法
KMP算法 KMP算法是一种字符串匹配算法,用于匹配模式串P在文本串S中出现的所有位置。 例如S“ababac,P“aba”,那么出现的所有位置是13。 在初学KMP时,我们只需要记住和学会使用模板即可,对其原理只需简单理解ÿ…...
《汇编语言》- 读书笔记 - 第13章-int 指令
《汇编语言》- 读书笔记 - 第13章-int 指令 13.1 int 指令13.2 编写供应用程序调用的中断例程中断例程:求一 word 型数据的平方主程序中断处理程序执行效果 中断例程:将一个全是字母,以0结尾的字符串,转化为大写主程序中断处理程序…...
深入了解 Golang 条件语句:if、else、else if 和嵌套 if 的实用示例
条件语句 用于根据不同的条件执行不同的操作。Go中的条件可以是真或假。Go支持数学中常见的比较运算符: 小于 < 小于等于 < 大于 > 大于等于 > 等于 不等于 ! 此外,Go还支持常见的逻辑运算符: 逻辑与 && 逻辑或…...
大数据和机器学习在气象预报中的应用-张平文院士
报告链接:张平文院士 -- 大数据和机器学习在气象预报中的应用_哔哩哔哩_bilibili...
C#高级:Winform桌面开发中DataGridView的详解
一、每条数据增加一个按钮,点击输出对应实体 请先确保正确添加实体的名称和文本: private void button6_Click(object sender, EventArgs e) {//SQL查询到数据,存于list中List<InforMessage> list bll.QueryInforMessage();//含有字段…...
java八股文复习-----2024/03/05----基础---反射,动态代理。序列化
来源一 大彬八股文 来源二 2023 20W字八股文 2024秋招八股文 1.Java创建对象有几种方式? Java创建对象有以下几种方式: 用new语句创建对象。使用反射,使用Class.newInstance()创建对象。调用对象的clone()方法。运用反序列化手段&#x…...
【人工智能】Anthropic发布强大的Claude3对齐GPT-4,大模型杂谈个人感想
北京时间3月5日,人工智能创业公司Anthropic宣布,推出其突破性的Claude 3系列模型。Claude 3系列包含三个子模型,分别为Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus,它们提供不同程度的智能、速度和成本选择,以满足…...
基于openKylin与RISC-V的MindSpore AI项目实践
项目目标: 在openKylin系统上安装和配置MindSpore框架。开发一个简单的图像分类模型,并在RISC-V平台上进行训练和推理。根据RISC-V的特性,对MindSpore框架进行必要的优化。 目录 项目目标: 训练模型 编写训练代码,设…...
【牛客】VL64 时钟切换
描述 题目描述: 存在两个同步的倍频时钟clk0 clk1,已知clk0是clk1的二倍频,现在要设计一个切换电路,sel选择时候进行切换,要求没有毛刺。 信号示意图: 波形示意图: 输入描述: clk0 clk1为时…...
Java设计模式——桥连模式
桥接模式简单来说就是通过将抽象部分和具体部分分离,使它们可以独立地变化。如果你的一个类存在多个变化维度(如抽象和具体的实现)。若使用继承来处理这些变化,将会导致类层次结构的急剧增加,难以管理和维护。并且&…...
数据结构与算法:堆排序和TOP-K问题
朋友们大家好,本节内容来到堆的应用:堆排序和topk问题 堆排序 1.堆排序的实现1.1排序 2.TOP-K问题3.向上调整建堆与向下调整建堆3.1对比两种方法的时间复杂度 我们在c语言中已经见到过几种排序,冒泡排序,快速排序(qsor…...
【NR 定位】3GPP NR Positioning 5G定位标准解读(三)
目录 前言 5 NG-RAN UE定位架构 5.1 架构 5.2 UE定位操作 5.3 NG-RAN定位操作 5.3.1 通用NG-RAN定位操作 5.3.2 OTDOA定位支持 5.3.3 广播辅助信息支持 5.3.4 NR RAT相关定位支持 5.4 NG-RAN中与UE定位相关的元素功能描述 5.4.1 用户设备(UE) …...
文件操作与IO(3) 文件内容的读写——数据流
目录 一、流的概念 二、字节流代码演示 1、InputStream read方法 第一个没有参数的版本: 第二个带有byte数组的版本: 第三个版本 搭配Scanner的使用 2、OutputStream write方法 第一个版本: 第二个写入整个数组版本: …...
《PyTorch深度学习实践》第十一讲卷积神经网络进阶
一、 1、卷积核超参数选择困难,自动找到卷积的最佳组合。 2、1x1卷积核,不同通道的信息融合。使用1x1卷积核虽然参数量增加了,但是能够显著的降低计算量(operations) 3、Inception Moudel由4个分支组成,要分清哪些是在Init里定义…...
Ansible的playbook的编写和解析
目录 什么是playbook Ansible 的脚本 --- playbook 剧本 实例部署(使用playbook安装启动httpd服务) 1.编写一个.yaml文件 在主机下载安装http,将配置文件复制到opt目录下 运行playbook 在192.168.17.77主机上查看httpd服务是否成功开启…...
[环境配置]ssh连接报错“kex_exchange_identification: read: Connection reset by peer”
已经被VScode ssh毒死好几次了,都是执行命令意外中断,然后又VSCode里连不上、本机Terminal也连不上了。。。 重启远程服务器,VSCode可以连上了, 系统ssh还是不行,报错“kex_exchange_identification: read: Connecti…...
Mybatis-Plus——04,自动填充时间(新注解)
自动填充(新注解) 一、数据库添加两个字段二、实体类字段属性上增加注解三、编写填充器四、查看结果4.1 插入结果4.2 修改结果 五、同步修改5.1实体类属性改成 INSERT_UPDATE5.2 在填充器的方法这里加上 updateTime5.3 查看结果————————创作不易…...
【动态规划入门】最长上升子序列
每日一道算法题之最长上升子序列 一、题目描述二、思路三、C代码 一、题目描述 题目来源:LeetCode 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 输入格式 第一行包含整数 N。 第二行包含 N个整数,表示完整序列。 输出格式 输出一个整数…...
LabVIEW眼结膜微血管采集管理系统
LabVIEW眼结膜微血管采集管理系统 开发一套基于LabVIEW的全自动眼结膜微血管采集管理系统,以提高眼结膜微血管临床研究的效率。系统集成了自动化图像采集、图像质量优化和规范化数据管理等功能,有效缩短了图像采集时间,提高了图像质量&#…...
通过GitHub探索Python爬虫技术
1.检索爬取内容案例。 2.找到最近更新的。(最新一般都可以直接运行) 3.选择适合自己的项目,目前测试下面画红圈的是可行的。 4.方便大家查看就把代码粘贴出来了。 #图中画圈一代码 import requests import os import rewhile True:music_id input("请输入歌曲…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...

