首页 > 其他分享 >KMP

KMP

时间:2023-09-28 10:56:40浏览次数:36  
标签:int 代码 KMP lens lent strlen

写在前面

本篇代码来源于皎月半撒花大佬的博客(指路
加上了一些自己的理解,重写了代码注释,可能算转载plus罢
(好像每次都是这样的)(找好看的代码来背)


代码注释

洛谷P3375为例。

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6+6;
int nex[N], lens, lent;
char s[N], t[N];

int main(){
    scanf("%s%s", s+1, t+1); // 输入 
    lens = strlen(s+1), lent = strlen(t+1); // 字符串长度 
    for(int i = 2, j = 0; i <= lent; i++){ // 枚举匹配串 
		// 求在i+1失配后应该返回到哪里(失配数组) 
        while(j && t[i] != t[j+1]) // 失配则继续往回跳 
            j = nex[j]; // 要保证 1~j 和 i-j+1~i 按位相等 
        if(t[j+1] == t[i]) j++; // 匹配成功则去到下一位置 
        nex[i] = j; // 得到匹配数组
    }
    for(int i = 1, j = 0; i <= lens; i++){ // 枚举文本串 
        while(j && s[i] != t[j+1]) // 失配则跳 
            j = nex[j]; // 跳跳跳 (直到跳回第一个字符) 
        if(t[j+1] == s[i]) j++; // 匹配成功则去到下一位置 
        if(j == lent){ // 如果1~lent都完全匹配 
            printf("%d\n", i-lent+1); // 输出匹配的开头 
            j = nex[j]; // 继续匹配 
        }
    }
    for(int i = 1; i <= lent; i++)
        printf("%d ", nex[i]); // 输出失配数组 
    return 0;
}

标签:int,代码,KMP,lens,lent,strlen
From: https://www.cnblogs.com/meteor2008/p/17735183.html

相关文章

  • KMP算法
    KMP算法可以看做是对暴力求解的一种改进,在前面的暴力算法中,i指针和j指针都是要回溯的,这是不合理的,因为当发现不匹配的时候,已经扫描到的区域我们其实是已知的,如下图所示当我们发现不匹配后,我们其实已经知道了主串的第1到第5个字符是什么,其实就是模式串前面的字符,KMP算法就是将这......
  • 较难理解的字符串查找算法KMP
    时间复杂度O(n)的子串查找算法。经典实例主字符串(s):abcabcabd模式串(t):abcabd比较次数   主字符串   模式串   备注一   abcabcabd   abcabd   红色和绿色表示正在比较的子串,红色表示不同部分,绿色表示相同部分。二   abcabcabd   abcabd  ......
  • KMP【模板】
    P3375【模板】KMP字符串匹配点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10;strings1,s2;intne[N];voidget_ne(){ ne[1]=0; intn=s2.length(); for(inti=2,j=0;i<=n;i++){ while(j&&s2[j+1]!=s2[......
  • KMP
    KMP板子链接[kmp](831.KMP字符串-AcWing题库)#include<iostream>#include<algorithm>#definelllonglongusingnamespacestd;constintN=1e5+10,M=1e6+10;charp[N],s[M];//p为模式串,s为模板串intne[N];//ne[j]含义:是p[1,j]中前缀与后缀相同的最大长度,大小等于......
  • 6.1 KMP算法搜索机器码
    KMP算法是一种高效的字符串匹配算法,它的核心思想是利用已经匹配成功的子串前缀的信息,避免重复匹配,从而达到提高匹配效率的目的。KMP算法的核心是构建模式串的前缀数组Next,Next数组的意义是:当模式串中的某个字符与主串中的某个字符失配时,Next数组记录了模式串中应该回退到哪个位置,以......
  • 6.1 KMP算法搜索机器码
    KMP算法是一种高效的字符串匹配算法,它的核心思想是利用已经匹配成功的子串前缀的信息,避免重复匹配,从而达到提高匹配效率的目的。KMP算法的核心是构建模式串的前缀数组Next,Next数组的意义是:当模式串中的某个字符与主串中的某个字符失配时,Next数组记录了模式串中应该回退到哪个位置,以......
  • 6.1 KMP算法搜索机器码
    KMP算法是一种高效的字符串匹配算法,它的核心思想是利用已经匹配成功的子串前缀的信息,避免重复匹配,从而达到提高匹配效率的目的。KMP算法的核心是构建模式串的前缀数组Next,Next数组的意义是:当模式串中的某个字符与主串中的某个字符失配时,Next数组记录了模式串中应该回退到哪个位置,......
  • Z函数(扩展KMP)
    Z函数(扩展KMP)用于解决以下问题:给定一个长度为n的字符串\(s\),求出一个数组\(z\),其中\(z_i\)表示字符串\(s(0,n-1)\)和\(s(i,n-1)\)的最长公共前缀。其中\(|s|<=2\times10^7\)。假设当前已经求出了\(z_0\)到\(z_{i-1}\),下一个要求\(z_i\):设\(p\)为\(1\)到\(i-1\)......
  • 便捷的视觉体验与乐趣:KMPlayer
    Kmplayer是一款来自韩国的影音播放器,Kmplayer(简称KMP)几乎可以播放您系统上所有的影音文件。KMPlaye通过各种插件扩展KMP可以支持层出不穷的新格式。这款软件强大的插件功能,能够直接使用winamp的音频,输入,视觉效果插件。只要你喜欢,可以选择使用不同解码器对各种格式进行解码。KMPla......
  • KMP字符串对比算法及next数组计算
    (注:该贴主要运用python实现该算法)先谈谈KMP算法吧。KMP算法的全称是Knuth-Morris-Pratt算法,它是用来进行字符串查找,即在某个主字符串里面找到某个特定子字符串。但是好像这个问题也可以直接暴力查找来完成啊,可是暴力查找的的缺点是不可忽视的:它的时间复杂度太高了!一旦遇......