(模板)KMP算法

【算法模板】KMP算法 简述 KMP算法:由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,串匹配算法,一般串都是指字符串。KMP是基于双指针算法的 应用:一个字符串在另外一个字符串中出现的位置和 循环节 一般地,被匹配的字符串叫主串,用来匹配主串的叫模式串 如果我们不用KMP,来查找一个字符串在另外一个字符串中第一次出现的位置,暴力求解时间复杂度是O(NM),用KMP优化查询时间复杂度是O(1),但是空间复杂度是O(N)。M和N分别是模式串和字串的大小。 KMP讲解 我觉得MOOC浙江大学数据结构讲的很不错, 阅读详情

写了几种版本,首先是string版的。string大法吼哇!!!
这里的next1[i]指的是在0~i-1构成的字符串中有多大长度的相同前缀后缀,同时也是模式串str2[i]匹配失败后跳转到的位置。同时值得注意的是这里的字符串是从0开始的

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int next1[1000005];
void getnext(string str)
{
    next1[0]=-1;
    int k=-1,j=0;
    while(j<str.size()-1){
        if(k==-1||str[k]==str[j]){
            k++;j++;
            next1[j]=k;
        }
        else{
            k=next1[k];
        }
    }
}
int main()
{
    string str1,str2;
    cin>>str1>>str2;
    getnext(str2);
    int i=0,j=0;
    while(i<str1.size()){//因为是输出s1中所有s2的位置所以while里只对s1的长度做出限制
        if(j==-1||str1[i]==str2[j]){
            if(j==str2.size()-1){//判断一定要放在这里,否则i++,j++会导致重叠部分无法利用,比如ABABABAB和ABAB的匹配
                cout<<i-str2.size()+1<<endl;
                j=next1[j];continue;
            }
            i++;j++;
        }
        else{
            while(j>=0&&str2[j]!=str1[i])//这里注意要加等于号
                j=next1[j];
        }
    }
//    if(j==str2.size()){
//
//    }
    for(i=0;i<str2.size();i++)
        cout<<next1[i]<<' ';

    return 0;
}

字符串从1开始的版本,By Poeroz

// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1000005;
int n,m,j,cnt;
char A[N],B[N];
int next1[N];
int main()
{
    scanf("%s%s",A+1,B+1);
    n=strlen(A+1);m=strlen(B+1);
    next1[1]=0;j=0;
    for(int i=2;i<=m;i++){
        while(j&&B[j+1]!=B[i])j=next1[j];
        if(B[j+1]==B[i])j++;//避免j=0的情况
        next1[i]=j;
    }
    j=0;
    for(int i=1;i<=n;i++){
        while(j&&B[j+1]!=A[i])j=next1[j];
        if(B[j+1]==A[i])j++;
        if(j==m){
            cout<<i-m+1<<endl;
            cnt++;j=next1[j];
        }
    }
    //cout<<cnt<<endl;
    for(int i=1;i<=m;i++)
        cout<<next1[i]<<' ';

    return 0;
}
算法学习之KMP(模板整理) 犹记当年学习C语言的字符串的时候那个悲情。。。 于是组队之后果断声明:鶸不玩字符串 然后将字符串丢给队友。。。 后来觉得吧,一些基础的东西还是要会的,比如KMP 粗浅的学了下KMP算法,也不敢瞎说什么,主要整理了下模板 学习记录: 主要看了刘大大的蓝书《算法竞赛入门经典--训练指南》 还有几篇博客:                            1. KMP算法详解 阅读详情

相关推荐

库卡机器人外部轴配置全流程:从接线到WorkVisual 6.0实战(附避坑指南)

本文详细解析了库卡机器人外部轴配置的全流程,涵盖从硬件接线到WorkVisual 6.0软件配置的实战步骤。重点介绍了KPP驱动模块连接、电机参数匹配、安全配置激活及零点标定等关键环节,并提供了实用的避坑指南,旨在帮助工程师高效、安全地完成外部轴集成,提升工作站柔性。

weixin_29161785的博客 496

KMP算法模板

例题 SDUT OJ 数据结构实验之串一:KMP应用 #include <iostream> #include <cstdio> #include <cstdlib> #include <string.h> #include <algorithm> using namespace std; const int N = 11234567; int n,m; int Next[N]; int a[N],b[N]; void get_next(in

qq_45728527的博客 185

Blender入门教程-3D视图界面介绍

3D视图用于与3D场景交互,可用于各种目的,例如建模、动画、纹理绘制等。在关闭 启动画面 后,启动场景会显示在3D视口中(如果没有加载其他blend文件)。01 标题栏标题栏包含了基于当前 模式 的各种菜单和控制。

weixin_52345129的博客 2287

算法修炼之筑基篇——筑基一层后期(解决KMP算法,KMP算法模板)

算法修炼之筑基篇——筑基一层后期(解决KMP算法,KMP算法模板)

VLOKL的博客 443

AI 代码赋能短视频带货:服装及多赛道批量内容生产全流程实操

本文聚焦 AI 技术在短视频带货领域的落地应用,以服装赛道为核心,延伸至花卉绿植、图书、茶具等热门领域,系统拆解 AI 工具在选品、素材处理、视频制作(含动态效果、场景搭建)、运营优化等环节的实操方法。针对从业者普遍面临的 “内容生产低效”“无专业技术难出优质视频”“流量运营踩坑” 等痛点,提供从基础工具使用到高阶视频制作的全流程技术方案,助力相关从业者借助 AI 实现批量、高效的短视频内容产出。

m0_67958922的博客 3084

2024最新实战:用1Panel面板+Docker快速部署Frps服务端(含Nginx配置模板)

本文详细介绍了2024年企业级内网穿透方案,通过1Panel面板和Docker技术快速部署Frps服务端,包含Nginx反向代理配置模板。从服务器选型、系统准备到安全加固,提供全栈实战指南,帮助企业和开发者高效实现内网穿透需求。

weixin_27966471的博客 419

kmp算法模板

#include<iostream> #include<vector> #include<queue> using namespace std; /* next数组的含义 初始化: next[0] = -1; next[i]:当当前位置不匹配时,需要回溯的位置 如模板串 ababa next[] = {-1, 0, 0, 1, 2, 3} //最后一个位置next[5]=3 代表全部匹配需要回溯的位置,即前面有3个字符是重复的。 可以看出next[i]其实也是当前下标

qq_40181728的博客 288

Qt上位机实战:5步搞定STM32 IAP固件升级(附拖拽文件处理技巧)

本文详细介绍了如何使用Qt开发STM32 IAP固件升级上位机。通过五个核心步骤,包括理解IAP机制、搭建Qt环境、实现拖拽文件加载、封装串口通信以及设计可靠通信协议,帮助开发者快速构建一个稳定、易用且支持图形化操作的固件升级工具,显著提升嵌入式产品开发与维护效率。

ss78901的博客 1076

好记忆的KMP算法模板

介绍了一种好记得的KMP模板,并给出难点部分的解答,还比较了求next和匹配两个部分之间的异同点辅助记忆。

Kent的博客 342

通过轻量级图像增强Transformer (IAT) 提升YOLOv8在低光环境下的检测性能

随着深度学习和计算机视觉的快速发展,目标检测模型在各个领域中的应用不断扩展,特别是在低照度环境下的视觉任务。YOLOv8作为当前最先进的目标检测模型之一,在高亮度和良好照明条件下表现出色,但在低照度环境下的性能存在一定的不足。为了解决这一问题,我们提出了一种轻量级的低照度图像增强网络(IAT)来改进YOLOv8的暗光检测能力。本篇文章将深入探讨这一创新改进,并附带代码实现,帮助大家更好地理解这一技术的应用和效果。

博客 1214

基于Simulink的压缩空气储能(Compressed Air Energy Storage, CAES)

压缩空气储能(CAES)是一种将电能转化为压缩空气存储在高压容器中,然后在需要时释放空气驱动涡轮机发电的技术。它具有大规模、长寿命和环境友好的特点,在电力系统中用于削峰填谷、频率调节和备用电源等应用。本项目将详细介绍如何在MATLAB/Simulink中搭建一个完整的基于压缩空气储能的系统,并提供具体的代码实现和设计步骤。如果你需要实现更复杂的控制逻辑,可以使用MATLAB Function模块。以下是一个简单的例子,展示了如何在该模块中实现一个条件逻辑:Matlab深色版本Kp = 1;

MHD0815的博客 1274

KMP算法总结与模板

发现学了好久了KMP了,模板却总是背不会,感觉自己还是没有理解深刻。。。。。。 求解的基本问题 给定一个模式串S长度为m,和模板串P长度为n,求解模板串P在模式串S中出现的位置 解决方法 模板串P需要同模式串S匹配很多次,当一个字符匹配失效时,传统的算法往往模板串P会整个从头开始,导致算法的时间复杂度是O(m∗n)O(m*n)O(m∗n), ...

xiongyuqing的博客 260

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

KMP详细解释及KMP算法模板

KMP是什么,KMP解决什么类型的问题 KMP全称为Knuth Morris Pratt算法,是一种高效的字符串匹配算法,寻找一个字符串中是否包含另一个字符串,例如 char *s = "ababababcab"; char *p = "ababc"; s为模板串(主串),p为字串,在s中找到p的位置 ...

zhbbbbbb的博客 3293

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构——KMP算法及改进算法模板(C语言)

前言 本篇博客主要是给出KMP算法的模板,所适应的读者都是接触过数据结构中KMP算法的人,并对其有了解,当然,如果你是初学者,你可以收藏起来,等自己真正需要时,可以拿来看看。当然,如果有写的不好的地方,希望大家指正。好了,不多说,直接上代码。 代码 //KMP算法代码模板 //获取next数组 int get_next(char T,int *next){ int i,j; i=1; j=0; next[i]=0; while(i<T[0]){

weixin_45637300的博客 484

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java版KMP算法模板

构建部分匹配表(PMT),这是KMP算法的核心预处理步骤pmt[i]表示pattern[0...i]的最长公共前后缀长度时间复杂度:O(m),m为模式串长度:执行KMP搜索算法利用构建好的部分匹配表在文本中高效搜索模式串时间复杂度:O(n+m),n为文本长度文本:"ABABDABACDABABCABAB"模式串:"ABABCABAB"输出结果为模式串在文本中的起始位置和匹配部分。

2301_81193552的博客 730

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置开始完全匹配的? kmp裸题,复杂度O(n+m)。 当一个字符串以0为起始下标时,next[i]可以描述为"不为自身的最大首尾重复子串长度"。 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 并且next[j]恰好等于这个最大长度。 防止超时,注意一些细节。。 另外:尽量少用str

NK_test的博客 2642

字符串匹配KMP算法Java模板(可直接使用)

KMP算法不做过多介绍,想要了解的同学可以自行学习。这里给出一个可以直接使用的Java模板,代码如下: public class SubstringSearch { //构建失配数组 private int[] computeTemporaryArray(char pattern[]){ int [] lps = new int[pattern.length]; int j =0; for(int i=1; i < pattern.len

乔卿的博客 809

算法刷题【洛谷P3375】【模板】KMP字符串匹配(KMP算法模板 超详细易懂讲解)

给出两个字符串 s_1s 1 ​ 和 s_2s 2 ​ ,若 s_1s 1 ​ 的区间 [l, r][l,r] 子串与 s_2s 2 ​ 完全相同,则称 s_2s 2 ​ 在 s_1s 1 ​ 中出现了,其出现位置为 ll。 现在请你求出 s_2s 2 ​ 在 s_1s 1 ​ 中所有出现的位置。 定义一个字符串 ss 的 border 为 ss 的一个非 ss 本身的子串 tt,满足 tt 既是 ss 的前缀,又是 ss 的后缀。 对于 s_2s 2 ​

异想之旅的博客 1106

算法模板 KMP算法

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

qq_45787905的博客 405

KMP算法模板(草解)

在长度为N的字符串中匹配长度为m的字符串,KMP算法是在任何的字符串中匹配中时间复杂度都是O(m+n),不会出现极致的情况O(n*m) 简单得讲他就是先对字符串N进行预处理,从而在与字符串M匹配时跳过一些字符串,从而达到快速匹配的目的 他是怎么实现的呢? 假设指针i指向字符串N,j指向字符串M的位置,在使用KMP算法时,指向N的i指针是不会回溯的,而是一直往后面走,大大减少了时间复杂度,-------KMP的核心就是Next[]数组的使用,,当出现失配后,当进行下一次匹配时,用Next[]指出j回溯的位置

qq_45595985的博客 246

算法模板——KMP字符串匹配

功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置 原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单模板大量匹配待匹配串时,这个会有相当大的优势,AC自动机虽然好想一些,但是在这一类问题上的性价比就略低了 1 var 2 i,j,k,l,m,n:longint; 3...

190
上一篇: 洛谷P1160
下一篇: 链表test
HumveeA6
博客等级 码龄17年 12粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值