杭电 1711 Number Sequence

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

int a[1000010],b[10010];

int next[10010];

void get_next()

{

    int i=1,j=0;

    next[1]=0;

    while(i<b[0])

    {

        if(b[i]==b[j]||j==0)

        {

             i++;

             j++;

             if(b[i]!=b[j])

             {

                  next[i]=j;

             }

             else

             {

                  next[i]=next[j];

             }

        }

        else

        {

            j=next[j];

        }

    }

}

int index_kmp()

{

    int i,j;

    i=j=1;

    while(i<=a[0]&&j<=b[0])

    {

          if(a[i]==b[j]||j==0)

          {

              i++;

              j++;

          }

          else

          {

              j=next[j];

          }

    }

    if(j>b[0])

    {

        return i-b[0];

    }

    else

    {

        return -1;

    }

}

int main()

{

    int t,n,m;

    scanf("%d",&t);

    while(t--)   

    {

        memset(a,0,sizeof(a));

        memset(b,0,sizeof(b));

        memset(next,0,sizeof(next));

        scanf("%d%d",&n,&m);

        a[0]=n;

        b[0]=m;

        for(int i=1;i<=n;i++)

        {

            scanf("%d",&a[i]);

        }

        for(int i=1;i<=m;i++)

        {

            scanf("%d",&b[i]);

        }

        get_next();

        int p=index_kmp();

        printf("%d\n",p);

    }

    system("pause");

    return 0;

}

你可能感兴趣的:(sequence)