kmp算法模板

Posted myrtle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kmp算法模板相关的知识,希望对你有一定的参考价值。

 

目的:在字符串T中查找字符串P的出现位置,预处理P字符串得到fail数组

时间复杂度:O(|P|+|T|)

自用模板:

技术图片
#include <iostream>
#include <string.h>
using namespace std;
int Next[1110];
void get_Next(char *p)

    int m=strlen(p);
    Next[0]=Next[1]=0;
    for(int i=1;i<m;i++)
    
        int j=Next[i];
        while(j&&p[i]!=p[j])
        j=Next[j];
        Next[i+1]=p[i]==p[j]?j+1:0;
    

int kmp(char *T,char *s)

    int n=strlen(T),m=strlen(s);
    get_Next(s);
    int j=0;
    for(int i=0;i<n;i++)
    
        while(j&&T[i]!=s[j])
        j=Next[j];
        if(s[j]==T[i])
        j++;
        if(j==m)
        
            return i-m+1;
        
    
    return -1;

int main()

    char s[1100],T[1100];
    cin>>T>>s;
    cout<<kmp(T,s)<<endl;  //在T中找s
    return 0;
View Code

修改模板(在字符串T中查找P的出现次数):

技术图片
int kmp(char *T,char *s)

    int n=strlen(T),m=strlen(s),ans=0;
    get_Next(s);
    int j=0;
    for(int i=0;i<n;i++)
    
        while(j&&T[i]!=s[j])
        j=Next[j];
        if(s[j]==T[i])
        j++;
        if(j==m)
        
            ans++;
            j=Next[j];
          
    
    return ans;
View Code

 

以上是关于kmp算法模板的主要内容,如果未能解决你的问题,请参考以下文章

模板KMP算法

[模板]KMP算法

KMP算法模板

kmp算法模板

KMP算法模板

(模板)扩展kmp算法(luoguP5410)