初识KMP

初识KMP

例题传送门

KMP算法是一种改进的字符串匹配算法,时间复杂度为O(m+n)。

? ——百度百科

KMP算法最重要的一个内容就是next数组,它让KMP算法从普通的字符串匹配算法的O(mn)优化到了O(n+m)。

next数组主要的功能就是让两个串匹配失败时,能够快速地找到下一个匹配的地方。

例如:

串A——> ABABABC
串B——> ABA

next数组要求出对于每个next[j],使B[1...k]=B[j-k+1...j]最大的k

所以就有以下程序:

for(int i=1,j=0;i<m;++i){
        while(j&&b[i+1]!=b[j+1])j=next[j];
        if(b[i+1]==b[j+1])++j;
        next[i+1]=j;
    }

这时我们得到的next数组有什么用呢?

for(int i=0,j=0;i<n;++i){
        while(j&&a[i+1]!=b[j+1])j=next[j];//当两个位置失配时,j指针就往前跳
        if(a[i+1]==b[j+1]){
            ++j;
            if(j==m)printf("%d\n",i-j+2);
        }
    }

其实自己理解一下就行了。

贴代码

#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
char a[N],b[N];
int p[N],n,m;
int main(){
    cin>>a+1>>b+1;
    n=strlen(a+1),m=strlen(b+1);
    for(int i=1,j=0;i<m;++i){
        while(j&&b[i+1]!=b[j+1])j=p[j];
        if(b[i+1]==b[j+1])++j;
        p[i+1]=j;
    }
    for(int i=0,j=0;i<n;++i){
        while(j&&a[i+1]!=b[j+1])j=p[j];
        if(a[i+1]==b[j+1]){
            ++j;
            if(j==m)printf("%d\n",i-j+2);
        }
    }
    for(int i=1;i<=m;++i)printf("%d ",p[i]);
    return 0;
}

HL大佬说KMP其实没什么用,到时候可以用更优的算法来替代。

原文地址:https://www.cnblogs.com/ADMAN/p/10327211.html

时间: 2024-11-09 00:03:41

初识KMP的相关文章

HDU_1711_初识KMP算法

Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 22568    Accepted Submission(s): 9639 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b

【初识】KMP算法入门

举个例子 模式串S:a s d a s d a s d f a s d 匹配串T:a s d a s d f 如果使用朴素匹配算法—— 1 2 3 4 5 6 7 8 9 a s d a s d a s d f a s d a s d a s d f 1 2 3 4 5 6 7 此时,匹配到了S7和T7了,S7为a而T7为f,不匹配那么朴素的匹配算法会这么做—— 1 2 3 4 5 6 7 8 9 a s d a s d a s d f a s d a s d a s d f 1 2 3 4 5

【初识】KMP算法入门(转)

感觉写的很好,尤其是底下的公式,易懂,链接:http://www.cnblogs.com/mypride/p/4950245.html 举个例子 模式串S:a s d a s d a s d f a s d 匹配串T:a s d a s d f 如果使用朴素匹配算法—— 1 2 3 4 5 6 7 8 9 a s d a s d a s d f a s d a s d a s d f 1 2 3 4 5 6 7 此时,匹配到了S7和T7了,S7为a而T7为f,不匹配那么朴素的匹配算法会这么做——

初识Python,望君多多关照

在学习Python之前,我们接触过数据结构和网页制作.前者让我们学习如何把C语言运用的更加整齐规范,而后者让我们亲身学习如何运用所学,制作一个静态网页.通过这些课程的学习,让我对C语言产生了比较大的压力,以至于对编程.对这学期的Python课程都有一种如临大敌的感觉. 但是真的学习了这门课程,体会了编码过程中的一些固定运用方法和套路之后,也许过程中对这门课程隐隐约约产生了一点点朦胧的感觉,仿佛他也并没有想象中的那么困难,起码现在的学习让我认为,他可能没有C语言那么繁琐和麻烦.当然,以一个初学者的

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

hiho 1015 KMP算法 &amp;&amp; CF 625 B. War of the Corporations

#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一只河蟹,于是河蟹就向小Hi和小Ho提出了那个经典的问题:“小Hi和小Ho,你们能不能够判断一段文字(原串)里面是不是存在那么一些……特殊……的文字(模式串)?” 小Hi和小Ho仔细思考了一下,觉得只能想到很简单的做法,但是又觉得既然河蟹先生这么说了,就

初识数组排序!!!!

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>初识数组排序</title> <!--调试成功--> <style type="text/css"> *{ padding:0; margin: 0; } li,ul{ list-style: none; } #p

初识操作系统和linux

初识操作系统和linux 1.计算机系统由硬件系统和软件系统两大部分组成:是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动.高速地处理,然后把处理结果输出的现代化智能电子设备. 2.世界上第一台计算机是1946年诞生在美国宾州大学. 3.冯·诺依曼体系结构:1946年数学家冯·诺依曼于提出计算机硬件系统由运算器.控制器.存储器.输入设备.输出设备.摩根定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍.现在计算机技术进本很难遵

hdu2328 Corporate Identity 扩展KMP

Beside other services, ACM helps companies to clearly state their "corporate identity", which includes company logo but also other signs, like trademarks. One of such companies is Internet Building Masters (IBM), which has recently asked ACM for