hdu1711 KMP

#include<stdio.h>
#include<string.h>
#define maxn 1000010
int next[maxn],s[maxn],p[maxn];
int n,m;
void getnext()
{
    int j,k;
    k=-1;
    j=0;
    next[0]=-1;
    while(j<m)
    {
        if(k==-1||p[j]==p[k])
        {
            j++;
            k++;
            next[j]=k;
        }
        else k=next[k];
    }
}
int kmp()
{
    int i,j;
    getnext();
    i=0;
    j=0;
    while(i<n)
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else 
            j=next[j];
        if(j==m)
        {
            return i-m+1;
        }
    }
    return -1;
}
int main()
{
    int i,j,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%d",&s[i]);
        for(i=0;i<m;i++)
            scanf("%d",&p[i]);

        printf("%d
",kmp());
    }
}
原文地址:https://www.cnblogs.com/sweat123/p/4723384.html