kmp算法模板(算法详解不再重复)

#include<bits/stdc++.h>
using namespace std;
void getnext(int len);
int kmp(int len1,int len2);
char p[10005],t[100005];
int nnext[10005];
int main()
{
    int t1;
    scanf("%d",&t1);
    while(t1--)
    {
        scanf("%s%s",p,t);
        int tlen=strlen(t),plen=strlen(p);
        getnext(plen);
        printf("%d\n",kmp(tlen,plen));
    }
}
void getnext(int len)
{
    int k=-1;
    int j=0;
    nnext[0]=-1;
    while(j<len)
    {
        if(k==-1||p[k]==p[j])
            nnext[++j]=++k;
        else
            k=nnext[k];
    }

}
int kmp(int len1,int len2)
{
    int i=0;
    int j=0;
    int ans=0;
    while(i<len1&&j<=len2)
    {
        if(j==-1||p[j]==t[i])
        {
            j++;
            i++;
        }
        else
            j=nnext[j];
       if(j==len2)
        ans++;
    }
return ans;
}

猜你喜欢

转载自blog.csdn.net/weixin_42165786/article/details/81607007