/*
kmp的next数组存的是i之前的串的前缀和后缀的最长匹配长度
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int next1[10100];
int bmBc[10100],suff[10100],bmGs[10100];
string str;//模式串
string a;//主串
void makenext1()//找模式串的next数组,未优化
{
int l=str.size();
next1[0]=-1;
int k=-1,j=0;
while(j<l)
{
if(k==-1||str[j]==str[k])
{
++j;
++k;
next1[j]=k;
}
else
k=next1[k];
}
}
void getNext()//优化后的next1数组
{
int l=str.size();
next1[0]=-1;
int k=-1,j=0;
while(j<l)
{
if(k==-1||str[j]==str[k])
{
++j;
++k;
if(str[j]!=str[k])
next1[j]=k;
else
next1[j]=next1[k];
}
else
k=next1[k];
}
}
int kmp()//kmp算法
{
makenext1();
//getNext();
int i=0,j=0,sum=0;
int n=a.size();
int m=str.size();
while(i<n)
{
if(j==-1||a[i]==str[j])
i++,j++;
else
j=next1[j];
if(j==m)
{
//return i-j;//模式串第一次在主串中出现的位置
sum++;//模式串在主串中出现过多少次
}
}
return sum;//没出现过返回-1
}
void preBmBc()
{
int i;
int m=str.size();
for(int i=0; i<256; i++)
bmBc[i]=m;
for(i=0; i<m-1; i++)
bmBc[str[i]]=m-i-1;
}
void suffixes()
{
int m=str.size(),q;
suff[m-1]=m;
for(int i=m-2; i>=0; i--)
{
q=i;
while(q>=0&&str[q]==str[m-i-1+q])
q--;
suff[i]=i-q;
}
}
void preBmGs()
{
int i,j=0,m=str.size();
suffixes();
for(i=0; i<m; i++)
bmGs[i]=m;
for(int i=m-1; i>=0; --i)
if(suff[i]==i+1)
for(; j<m-1-i; ++j)
if(bmGs[j]==m)
bmGs[j]=m-1-i;
for(i=0; i<=m-2; i++)
bmGs[m-1-suff[i]]=m-1-i;
}
int BM()//有毒慎用
{
int i, j=0,sum=0;
preBmGs();
preBmBc();
// for(int i=0;i<=20;i++)
//printf("%d ",bmGs[i]);printf("\n");
int n=a.size(),m=str.size();
//for(int i=0;i<m;i++)
//printf("%d ",bmBc[str[i]]);printf("\n");
//j=0;
while (j<=n-m)
{
i=m-1;
while(i>=0&&str[i]==a[i+j])
i--;
if (i<0)//匹配成功
{
//OUTPUT(j);返回当前值
sum++;
j+=bmGs[0];
}
else
{
//printf("i=%d j=%d bm=%d\n",i,j,bmBc[a[i+j]]);
j+=max(bmGs[i],bmBc[a[i+j]]-m+1+i);
//printf("j=%d\n",j);
}
}
return sum;//不存在返回-1
}
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
cin>>str>>a;
int sum=kmp();
printf("%d\n",sum);//主串中有多少个模式串
}
}
相关推荐
【KMP算法详解——适合初学KMP算法的朋友】
KMP算法的初级体验,只为抛砖引玉之用
kmp算法总结
搞ACM也有三年了,期间学习了不少算法,到12月把上海站打完也要成退役狗了。最近突然想把学过的一些算法回过头来好好总结一下,于是就有了我的算法总结系列。这是这个系列的开端,所以先写一个简单点的算法,以后会慢慢复习一些复杂的算法,最后还是希望自己能够坚持下去吧。 KMP算法 KMP算法是一种线性时间复杂度的字符串匹配算法,它是对BF(Brute-Force,最基本的字符串匹配算法)的改进。对
KMP算法
NEXT[0] 通常初始化为 -1。如果,则,同时递增i和j。如果不匹配,且j > 0,回退到NEXT[j-1],否则。NEXT数组的构建时间复杂度是 O(m),其中 m 是子串的长度。代码演示:// 注意i从1开始,j从0开始// next数组的第一个值为0j++;i++;
KMP
KMP
ESP32-CAM实战:从零构建高精度QR二维码识别系统
本文详细介绍了如何使用ESP32-CAM构建高精度QR二维码识别系统,涵盖硬件配置、开发环境搭建、二维码识别库选择与优化、完整系统实现及实战问题排查。通过优化识别算法和电源管理,系统可实现快速、稳定的二维码识别,适用于物联网设备绑定等场景。
Go语言AI智能体开发实战:基于LangGraphGo构建下一代工作流引擎
在AI应用开发领域,工作流编排是构建复杂智能系统的核心技术。其核心原理是将任务执行过程建模为状态图,通过节点和边的组合定义数据流转路径,实现多步骤推理与工具调用的自动化。这种基于状态图的编程模型,为智能体提供了清晰的“思考-行动-观察”循环抽象,显著提升了复杂业务逻辑的可维护性和可观测性。从技术价值看,它解决了传统代码中状态分散、流程僵化的问题,支持条件分支、并行执行等高级模式,是实现生产级AI应用的关键基础设施。在应用场景上,该技术广泛适用于客服机器人、自动化审批、数据ETL等需要多步骤协调的领域。本文以
[kmp+模板] kmp模板
文章目录0. 前言1. kmp 0. 前言 kmp 模式匹配算法很牛,一般结合 kmp 的题目都不怎么简单,或是困难题目可以采用 kmp 的思想很快搞定,之前博文有写过 kmp· 算法原理,和简单实现了下,但是由于当时认识浅薄,大家看看就好。在此总结一个简单的 kmp 算法模板。 当时的博文:[杂谈] 12. BF、KMP、RK Algorithm 字符串匹配算法 1. kmp 这里是拿数组模拟栈。 模板代码: #include <iostream> using namespace std;
基于ROS2的实时视频流转换:image2rtsp在多路相机采集中的应用
本文详细介绍了如何在ROS2机器人系统中使用image2rtsp工具,将ROS2内部的相机图像话题实时转换为标准的RTSP视频流。重点阐述了其安装配置、核心参数调优,并提供了多路相机采集的实战方案,解决了机器人视觉数据跨平台、跨网络分发的难题,极大提升了视频流集成的部署效率。
2025 KMP 的现状和未来,选择 KMP 会有什么问题吗?
从目前来看,客户端领域还是很推荐使用 KMP 进行开发,前面说这些问题不是让你放弃,而是让你心里有个底,正常说来其实一般人都不会遇到什么大问题,而是否使用 CMP 就见仁见智了,目前国内 KMP 大厂使用的还比较客观,但是 CMP 的使用率其实并不高,使用 CMP 需要的技术积累会更高,特别适配鸿蒙的成本上,所以我个人更推荐 KMP ,至于 CMP 或者可以再稳稳,如果你想上生产环境。那么,2025 你准备好 KMP 了么?
高分系列卫星轨道、传感器参数等信息
遥感卫星数据简介-高分系列
SAP特殊采购类80实战:跨工厂生产配置避坑指南(附完整测试流程)
本文深入解析SAP特殊采购类80在跨工厂生产场景下的实战应用与配置要点。文章从核心业务逻辑出发,详细拆解了后台配置、主数据与BOM的“双工厂”思维模式,并提供了从创建需求到成品收货的完整测试流程。重点揭示了多层BOM下的需求传递陷阱及常见报错解决方案,旨在帮助SAP顾问及用户规避实施风险,实现资源的灵活调度与流程自动化。
扩展KMP
摘自 拓展kmp算法总结 1、扩展KMP是什么?解决何种问题?与KMP算法的异同? 拓展kmp是对KMP算法的扩展,它解决如下...
MiniMax H3 + ComfyUI 工作流搭建指南:从整合包到视频生成
AI视频生成正成为内容创作的新基础设施,而ComfyUI作为可视化工作流引擎,将复杂的模型推理过程拆解为节点与连线,让本地视频生成变得可复用、可批量。理解这一原理后,用户无需编写代码,只需掌握模型加载、提示词控制、采样与解码的基本链路,即可搭建出稳定的视频生产管线。MiniMax H3作为前沿视频生成模型,在ComfyUI中通过权重文件和自定义节点落地,配合整合包可大幅降低环境配置门槛。从硬件评估、目录结构到节点连接与参数调优,本文系统性梳理了从零跑通一条视频生成工作流的完整路径,帮助用户在批量素材生成、风
AcWing 831:KMP字符串 ← KMP算法
KMP 算法中的 next 数组仅取决于模式串本身,而与相匹配的主串无关。 next 数组的核心作用是“当模式串 T 的第 j 位与主串 S 的第 pos 位失配时(即 T[j]≠S[pos] 时),让模式串 T 的第 next[j] 位与主串 S 的第 pos 位再进行比较”。这相当于让模式串 T 往右移动了 j-next[j] 位后,再进行比较。
【Matlab】matlab代码实现迭代学习控制
该文介绍了在Matlab中实现迭代学习控制(ILC)的方法。ILC通过利用历史轨迹数据来优化重复任务的控制性能。文章提供了一个步进电机控制示例,包括:1)定义正弦轨迹;2)设置100次迭代和0.1学习率;3)建立二阶系统模型;4)执行ILC算法计算控制输入;5)绘制期望轨迹与实际输出的对比图。该示例展示了ILC的基本实现过程,并指出实际应用可能需要更复杂的设计。代码演示了误差计算、控制输入更新和结果可视化等关键步骤。
在iPad上使用Python进行编程
如果你拥有一台iPad,并且想在上面编写和运行Python代码,你会发现iPad提供了一些适用的工具和应用程序来满足你的需求。安装一个Python解释器应用程序,编写和运行Python代码,使用第三方库和模块,以及存储和共享代码,这些步骤将帮助你在iPad上进行Python编程。要在iPad上运行Python代码,首先需要安装一个Python解释器。这些应用程序提供了一个交互式的开发环境,允许你编写、编辑和运行Python代码。一旦你安装了Python解释器应用程序,你可以开始编写Python代码了。
kmp算法和kmp的优化
一、kmp是什么 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。 简单来...
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
大话 KMP 算法
LeetCode上有一题,简单难度的,以下是原题 这个题目应该刷LeetCode的同学大部分都刷到过,比较荒谬的是可以直接用 indexOf 方法实现,并且是最优的解法,看到评论以后一片哗然,大家扯到最多的是这道题就应该用KMP来做,如果用KMP做那这道题应该是困难级别的。所以看了这些评论以后,决定自己去摸索一下KMP的算法,以及大概其实现原理。 网上找了很多关于解释KMP算法的...
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
【黑马计划-1】KMP及扩展KMP
KMP 核心 玄学 failfailfail 数组 failfailfail 数组的含义即是某段字符串的最长公共前后缀。 具体来讲,设 T[1…j−1]=T[i−j…i−1](j⩽i)T[1…j−1]=T[i−j…i−1](j⩽i)T[1\ldots j-1]=T[i-j\ldots i-1](j\leqslant i) ,那么 fail[i]fail[i]fail[i] 为 jjj ...
最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版
Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。
kmp及扩展kmp
kmp kmp匹配主要匹配的是两个字符串,我们将需要匹配的记录为s1,用于匹配的串为s2. kmp匹配的是从以当前s1中的ch字符为末尾的字符串能够在s2中匹配的最大前缀的长度。 也即是s1中的每个前缀的最长后缀所匹配的s2的最长前缀。 先考虑自身与自身匹配的情况: 如果用dp+数学归纳来思考: 假设当前需要匹配j位置的字符,从0—j-1位置都已经记录了该位置能够匹配到的自身字符...
[Leetcode] KMP
题意:给定一个字符串text,和一个模式串pattern。让你判断text是否包含pattern,如果包含,则返回text中出现pattern的第一个字符的坐标。否则返回-1。如果pattern是空字符串(长度为0),则返回1 解法1—暴力:我们遍历text的每个位置i,并从i开始遍历长度为sizepsize_psizep的字符串,看其是否和pattern相等,如果相等返回i,否则继续遍历。 ...
KMP+扩展KMP
KMP next数组表示P[j]以前最长相同前缀后缀 若下标从0开始(以下模板就采用这种方式),next[ i ] 表示前面长度为 i 的字符串前缀和后缀相等的最大长度为 next[ i ] 。 若下标从1开始,则next[ i ] 表示前面长度 i - 1的字符串中前缀和后缀相等的最大长度为 next[ i ] - 1 两种方式当S[i]与P[j]不同时j都应该移动到next[j] const ...
KMP与扩展KMP(Z函数)
模板 KMP void getfail() { int i,j; j=0; for(i=2;i<=n;i++) { while(j&&s[i]!=s[j+1]) j=nxt[x][j]; if(s[i]==s[j+1]) j++; nxt[i]=j; } } 扩展KMP a[1……m], b[1……n] s = a + ‘*’ + b ...
KMP与扩展KMP算法
字符串的特征向量next[]:第i(0开始计数)个元素表示从第一个字符到第i个字符首尾最多匹配多少个字符. 注意这里是数目,与KMPNext是下标不同。 注意是子串匹配 例如:字符串abcdaabcab的特征向量是(0,0,0,0,1,1,2,3,1,2) 对于每个字符,暴力比较耗时。可看出每个字符的特征值可以由它之前的字符推出:用next[i]表示到第i个字符首尾匹配的字符数。则对于字符i...
2752



被折叠的 条评论
为什么被折叠?



