首页 > 代码库 > KMP小结

KMP小结


next数组表示的是,最长前缀和后缀相等的长度。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;

const int N=1000000;

int next[N];
char s[N],t[N];
/*********KMP小结**********/

//求next数组
void getNext(int lt)
{
    int k=-1,i=0;
    next[0]=-1;
    while(i<lt)
    {
        if(k==-1||s[k]==t[i])
            next[++i]=++k;
        else
            k=next[k];
    }
}

//KMP求模板串第一次出现的位置
int getIndex(int ls,int lt)
{
    getNext(lt);
    int i=0,k=0;
    while(i<ls&&k<lt)
    {
        if(k==-1||s[i]==t[k])
        {
            i++;
            k++;
        }
        else
            k=next[k];
    }
    if(k==lt) return i-lt+1;    //返回的下标从0,开始算。
    else return -1;

}

//KMP求模板串出现的次数

int getCnt(int ls,int lt)
{
    getNext(lt);
    int k=0,cnt=0;
    for(int i=0;i<ls;i++)
    {
        while(k!=-1&&s[i]!=t[k])
            k=next[k];
        if(s[i]==t[k]) k++;
        if(k==lt){
            cnt++;
            k=next[k];
        }

    }
    return cnt;
}


int main()
{
    cin>>s>>t;
    int ls=strlen(s);
    int lt=strlen(t);
    cout<<getIndex(ls,lt)<<endl;
    return 0;
}


KMP小结