HDU1711-----Number Sequence-----裸的KMP

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1711

题目意思:

找出b在a中的起始位置,没有则是-1

解题思路:

裸的KMP,不多说

不会KMP的话可以去看http://www.cppblog.com/oosky/archive/2006/07/06/9486.html

说的非常好

模板我是拿的大白的

代码:

 

#include<cstdio>

#include<cstring>

using namespace std;



const int maxn = 10000+10;

const int maxn2 = 1000000+10;



int a[maxn2];

int b[maxn];



int next[maxn];



void getnext(int T[],int len,int* qnext)

{

    qnext[0] = 0;

    qnext[1] = 0;

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

    {

        int j = qnext[i];

        while(j && T[i]!=T[j]) j = qnext[j];

        qnext[i+1] = (T[i]==T[j])?j+1:0;

    }

}



int KMP(int S[],int T[],int len1,int len2)

{

    getnext(T,len2,next);

    int j=0;

    for(int i=0;i<len1;i++)

    {

        while(j && S[i]!=T[j]) j = next[j];

        if(T[j] == S[i])

            j++;

        if(j==len2)//已经找到匹配串

        {

            return i-len2+1;

        }



    }

    return -1;

}



int main()

{

    int t;

    scanf("%d",&t);

    int n,m;

    while(t--)

    {

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

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

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

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

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

        int ans = KMP(a,b,n,m);

        if(ans != -1)

            printf("%d\n",ans+1);

        else

            printf("-1\n");

    }

    return 0;

}




 

 

你可能感兴趣的:(sequence)