HDU1711Number Sequence(KMP)

#include<stdio.h>
#include<string.h>
long s[1000005],t[10005];
int next[10005],m,n;
void get_next(long t[10005])
{
    int i=0,j=-1;
next[0]=-1;
    while(i<n)
    {
        if(j==-1||t[i]==t[j])
        {++i;
        ++j;
        next[i]=j;
        }
        else j=next[j];
    }
}
int index_kmp(long s[1000005],long t[10005],int pos)
{
    int i=pos,j=0;
    while(i<m&&j<n)
    {
        if(j==-1||s[i]==t[j])
        { ++i;++j;}
        else j=next[j];
    }
    if(j>=n) return i-n;
    else return -1;
}
int main()
{
    int T,f,i;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d",&m,&n);
        for(i=0;i<m;i++)
            scanf("%d",&s[i]);
        for(i=0;i<n;i++)
            scanf("%d",&t[i]);
        get_next(t);
        f=index_kmp(s,t,0);
        if(f!=-1)printf("%d\n",f+1);
        else printf("%d\n",f);

    }



    return 0;
}

KMP

posted @ 2013-04-17 19:00  Yuki_i  阅读(137)  评论(0编辑  收藏  举报