kmp

kmp习题大全 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70325#overview kuangbin带你飞专题十六kmp&扩展kmp&manacher A. 题意:给T组数据,每组有长度为n和m的母串和模式串。判断模式串是否是母串的子串,如果是输出最先匹配完成的位置,否则输出-1. 做法:直接套用模板。把char改成int。kmp函数中 阅读详情
/*
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算法前置知识串的基本概念C++C++C++中stringstringstring库的函数KMP核心算法—next数组KMP匹配next数组计算例题KMP算法改进其他字符串知识点计算最长前缀后缀计算循环节补充字符使原字符串变为循环串 KMP算法 ​ KMPKMPKMP算法是字符串匹配中的一个较好的算法,它的目的是在给定一个模式串ppp和原字符串qqq中,找到ppp在qqq中第一次出现的位置。 ​ 如上图所示,可以很简单的看出字符串ppp在字符串qqq中第一次出现的位置,如果位置从1开始计算的话 阅读详情

相关推荐

【KMP算法详解——适合初学KMP算法的朋友】

KMP算法的初级体验,只为抛砖引玉之用

Bill_Hoo的专栏 2752

kmp算法总结

搞ACM也有三年了,期间学习了不少算法,到12月把上海站打完也要成退役狗了。最近突然想把学过的一些算法回过头来好好总结一下,于是就有了我的算法总结系列。这是这个系列的开端,所以先写一个简单点的算法,以后会慢慢复习一些复杂的算法,最后还是希望自己能够坚持下去吧。 KMP算法 KMP算法是一种线性时间复杂度的字符串匹配算法,它是对BF(Brute-Force,最基本的字符串匹配算法)的改进。对

ddyyxx的程序员之路 1万+

KMP算法

NEXT[0] 通常初始化为 -1。如果,则,同时递增i和j。如果不匹配,且j > 0,回退到NEXT[j-1],否则。NEXT数组的构建时间复杂度是 O(m),其中 m 是子串的长度。代码演示:// 注意i从1开始,j从0开始// next数组的第一个值为0j++;i++;

码明的博客 4686

KMP

KMP

底层码农 6556

ESP32-CAM实战:从零构建高精度QR二维码识别系统

本文详细介绍了如何使用ESP32-CAM构建高精度QR二维码识别系统,涵盖硬件配置、开发环境搭建、二维码识别库选择与优化、完整系统实现及实战问题排查。通过优化识别算法和电源管理,系统可实现快速、稳定的二维码识别,适用于物联网设备绑定等场景。

weixin_42524703的博客 433

Go语言AI智能体开发实战:基于LangGraphGo构建下一代工作流引擎

在AI应用开发领域,工作流编排是构建复杂智能系统的核心技术。其核心原理是将任务执行过程建模为状态图,通过节点和边的组合定义数据流转路径,实现多步骤推理与工具调用的自动化。这种基于状态图的编程模型,为智能体提供了清晰的“思考-行动-观察”循环抽象,显著提升了复杂业务逻辑的可维护性和可观测性。从技术价值看,它解决了传统代码中状态分散、流程僵化的问题,支持条件分支、并行执行等高级模式,是实现生产级AI应用的关键基础设施。在应用场景上,该技术广泛适用于客服机器人、自动化审批、数据ETL等需要多步骤协调的领域。本文以

weixin_30457551的博客 360

[kmp+模板] kmp模板

文章目录0. 前言1. kmp 0. 前言 kmp 模式匹配算法很牛,一般结合 kmp 的题目都不怎么简单,或是困难题目可以采用 kmp 的思想很快搞定,之前博文有写过 kmp· 算法原理,和简单实现了下,但是由于当时认识浅薄,大家看看就好。在此总结一个简单的 kmp 算法模板。 当时的博文:[杂谈] 12. BF、KMP、RK Algorithm 字符串匹配算法 1. kmp 这里是拿数组模拟栈。 模板代码: #include <iostream> using namespace std;

Y-puyu 的博客 1892

基于ROS2的实时视频流转换:image2rtsp在多路相机采集中的应用

本文详细介绍了如何在ROS2机器人系统中使用image2rtsp工具,将ROS2内部的相机图像话题实时转换为标准的RTSP视频流。重点阐述了其安装配置、核心参数调优,并提供了多路相机采集的实战方案,解决了机器人视觉数据跨平台、跨网络分发的难题,极大提升了视频流集成的部署效率。

weixin_29214559的博客 395

2025 KMP 的现状和未来,选择 KMP 会有什么问题吗?

从目前来看,客户端领域还是很推荐使用 KMP 进行开发,前面说这些问题不是让你放弃,而是让你心里有个底,正常说来其实一般人都不会遇到什么大问题,而是否使用 CMP 就见仁见智了,目前国内 KMP 大厂使用的还比较客观,但是 CMP 的使用率其实并不高,使用 CMP 需要的技术积累会更高,特别适配鸿蒙的成本上,所以我个人更推荐 KMP ,至于 CMP 或者可以再稳稳,如果你想上生产环境。那么,2025 你准备好 KMP 了么?

恋猫de小郭的博客 2303

高分系列卫星轨道、传感器参数等信息

遥感卫星数据简介-高分系列

中遥科 3309

SAP特殊采购类80实战:跨工厂生产配置避坑指南(附完整测试流程)

本文深入解析SAP特殊采购类80在跨工厂生产场景下的实战应用与配置要点。文章从核心业务逻辑出发,详细拆解了后台配置、主数据与BOM的“双工厂”思维模式,并提供了从创建需求到成品收货的完整测试流程。重点揭示了多层BOM下的需求传递陷阱及常见报错解决方案,旨在帮助SAP顾问及用户规避实施风险,实现资源的灵活调度与流程自动化。

wind6的博客 1138

扩展KMP

摘自 拓展kmp算法总结 1、扩展KMP是什么?解决何种问题?与KMP算法的异同? 拓展kmp是对KMP算法的扩展,它解决如下...

Tang7O的博客 2193

MiniMax H3 + ComfyUI 工作流搭建指南:从整合包到视频生成

AI视频生成正成为内容创作的新基础设施,而ComfyUI作为可视化工作流引擎,将复杂的模型推理过程拆解为节点与连线,让本地视频生成变得可复用、可批量。理解这一原理后,用户无需编写代码,只需掌握模型加载、提示词控制、采样与解码的基本链路,即可搭建出稳定的视频生产管线。MiniMax H3作为前沿视频生成模型,在ComfyUI中通过权重文件和自定义节点落地,配合整合包可大幅降低环境配置门槛。从硬件评估、目录结构到节点连接与参数调优,本文系统性梳理了从零跑通一条视频生成工作流的完整路径,帮助用户在批量素材生成、风

weixin_29057065的博客 411

AcWing 831:KMP字符串 ← KMP算法

KMP 算法中的 next 数组仅取决于模式串本身,而与相匹配的主串无关。 next 数组的核心作用是“当模式串 T 的第 j 位与主串 S 的第 pos 位失配时(即 T[j]≠S[pos] 时),让模式串 T 的第 next[j] 位与主串 S 的第 pos 位再进行比较”。这相当于让模式串 T 往右移动了 j-next[j] 位后,再进行比较。

hnjzsyjyj的专栏 1342

【Matlab】matlab代码实现迭代学习控制

该文介绍了在Matlab中实现迭代学习控制(ILC)的方法。ILC通过利用历史轨迹数据来优化重复任务的控制性能。文章提供了一个步进电机控制示例,包括:1)定义正弦轨迹;2)设置100次迭代和0.1学习率;3)建立二阶系统模型;4)执行ILC算法计算控制输入;5)绘制期望轨迹与实际输出的对比图。该示例展示了ILC的基本实现过程,并指出实际应用可能需要更复杂的设计。代码演示了误差计算、控制输入更新和结果可视化等关键步骤。

unber的博客 200

在iPad上使用Python进行编程

如果你拥有一台iPad,并且想在上面编写和运行Python代码,你会发现iPad提供了一些适用的工具和应用程序来满足你的需求。安装一个Python解释器应用程序,编写和运行Python代码,使用第三方库和模块,以及存储和共享代码,这些步骤将帮助你在iPad上进行Python编程。要在iPad上运行Python代码,首先需要安装一个Python解释器。这些应用程序提供了一个交互式的开发环境,允许你编写、编辑和运行Python代码。一旦你安装了Python解释器应用程序,你可以开始编写Python代码了。

2301_79366435的博客 4624

kmp算法和kmp的优化

一、kmp是什么 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。 简单来...

harry12138小白的博客 1497

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

大话 KMP 算法

LeetCode上有一题,简单难度的,以下是原题 这个题目应该刷LeetCode的同学大部分都刷到过,比较荒谬的是可以直接用 indexOf 方法实现,并且是最优的解法,看到评论以后一片哗然,大家扯到最多的是这道题就应该用KMP来做,如果用KMP做那这道题应该是困难级别的。所以看了这些评论以后,决定自己去摸索一下KMP的算法,以及大概其实现原理。 网上找了很多关于解释KMP算法的...

lmx125254的博客 3833

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 ...

ezoixx174的博客 4791

最新的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位置都已经记录了该位置能够匹配到的自身字符...

qq_38890926的博客 261

[Leetcode] KMP

题意:给定一个字符串text,和一个模式串pattern。让你判断text是否包含pattern,如果包含,则返回text中出现pattern的第一个字符的坐标。否则返回-1。如果pattern是空字符串(长度为0),则返回1 解法1—暴力:我们遍历text的每个位置i,并从i开始遍历长度为sizepsize_psizep​的字符串,看其是否和pattern相等,如果相等返回i,否则继续遍历。 ...

nwpuxhld 2257

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 ...

UniverseofHK的博客 777

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 ...

micaudience的博客 1068

KMP与扩展KMP算法

字符串的特征向量next[]:第i(0开始计数)个元素表示从第一个字符到第i个字符首尾最多匹配多少个字符. 注意这里是数目,与KMPNext是下标不同。 注意是子串匹配 例如:字符串abcdaabcab的特征向量是(0,0,0,0,1,1,2,3,1,2) 对于每个字符,暴力比较耗时。可看出每个字符的特征值可以由它之前的字符推出:用next[i]表示到第i个字符首尾匹配的字符数。则对于字符i...

wangqianqianya的博客 1573
上一篇: 01背包变形(poj2184)
下一篇: Manacher算法--O(n)回文子串算法
acmer_zp
博客等级 码龄11年 18粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值