ACM模板——KMP算法

来源:互联网 发布:易语言在线更新源码 编辑:程序博客网 时间:2024/06/05 20:32

KMP

#include <string>#include <iostream>#include <cstring>using namespace std;void getfill(string s,int* f){    //memset(f,0,sizeof(f));  //根据其前一个字母得到    for(size_t i=1;i<s.size();i++)    {        int j=f[i];        while(j && s[i]!=s[j])            j=f[j];        f[i+1]=(s[i]==s[j])?j+1:0;    }}int KMP(string a,string s){    int* f=new int[s.size()+32];    memset(f,0,sizeof(int)*s.size());    getfill(s,f);size_t j=0;    for(size_t i=0;i<a.size();i++)    {        while(j && a[i]!=s[j])            j=f[j];        if(a[i]==s[j])            j++;        if(j==s.size()){            delete[] f;return i-s.size()+1;        }    }    delete[] f;    return -1;}

KMP (int)

注: N为数组T的长度, M为数组P的长度. Next数组长度应稍大于P的长度

void MakeNext(int* P,int M,int* Next){    Next[0] = -1;    int i = 0, j = -1;    while(i<M){        if(j==-1||P[i]==P[j]){            i++,j++;            if(P[i]!=P[j])Next[i] = j;            else Next[i] = Next[j];        }        else j = Next[j];    }}int KMP(int* T,int N,int* P,int M){    MakeNext(P,M,Next);    int i=0,j=0;    while(i<N&&j<M){        if(T[i]==P[j]||j==-1)i++,j++;        else j = Next[j];    }    if(j==M)return i-M;    else return -2;}


1 0