KMP模板

来源:互联网 发布:命令提示符编译java 编辑:程序博客网 时间:2024/06/11 02:52
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<string>using namespace std;int nnext[10000010];void kmp_pre(const char ch[],int m,int nnext[] ){    int i,j;    j=nnext[0]=-1;    i=0;    while(i<m)    {        while(-1!=j && ch[i]!=ch[j])            j=nnext[j];        nnext[++i]=++j;    }}int kmp_count(const char ch[],int m ,const char str[],int n){//ch是模式串,str是主串    int i,j;    int ans=0;    kmp_pre(ch,m,nnext);    i=j=0;    while(i<n)    {        while(-1!=j && str[i]!=ch[j])            j=nnext[j];        i++;  j++;        if(j >= m)        {            ans++;            j=nnext[j];        }    }    return ans;}int main(){#ifdef LOCALfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifstring a,b;cin>>a>>b;cout<<kmp_count(b.c_str(),b.length(),a.c_str(),a.length())<<endl;return 0;}

0 0