hdu 1711 Number Sequence(完全是KMP问题)

#include <stdio.h>
#include <string.h>

#define MAXN 1000005
#define MAXM 10005

int a[MAXN],b[MAXM],next[MAXM];

void getNext(int len)
{
    int j=0,k=-1;
    next[0]=-1;
    while(j < len)
    {
        if( k == -1 || b[j] == b[k] )
        {
            ++j;
            ++k;
            next[j]=k;
        }
        else k=next[k];
        /*  if( b[j] == b[k]) nextval[j] = nextval[ nextval[k] ];
        /  else nextval[j] = k;*/
    }
}

int kmp(int lena,int lenb)
{
    int i=0,j=0;
    while( i < lena && j < lenb )
    {
        if( j == -1 || a[i] == b[j] )
        {
            ++i;
            ++j;
        }
        else j = next[j];
    }
    if( j < lenb ) return -1;
    else return i-j+1;
}

int main()
{
    int T,i,N,M;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d",&N,&M);
        for(i=0; i<N; i++) scanf("%d",&a[i]);
        for(i=0; i<M; i++) scanf("%d",&b[i]);
        if(N < M) printf("-1\n");
        else
        {
            getNext(M);
            printf("%d\n",kmp(N,M));
        }
    }
    return 0;
}

posted @ 2010-08-27 14:19  菜到不得鸟  阅读(212)  评论(0)    收藏  举报