hdu 1711 Number Sequence

来源:互联网 发布:北京中科院软件中心 编辑:程序博客网 时间:2024/04/27 14:42

http://acm.hdu.edu.cn/showproblem.php?pid=1711

 

 

#include<stdio.h>
int
a[1000001],b[10001],hh[10001]={0};
int
n,m;
void
KMP()
{

    int
i;
    for
(i=1;i<m;i++)
    if
(b[i] == b[ hh[i-1] ])
            hh[i] = hh[i-1] + 1;
       else

            hh[i] = (b[i] == b[0]);
}

int
cmp()
{

    int
i=0,j=0;
    while
(i<n)
     {

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

            if
(a[i]==b[j]) j++;
           i ++;        }
        else

            j = hh[j-1];
         if
(j==m) return i-j+1;
     }

     return
-1;
}

int
main()
{

     int
T,i,j,K;
     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]);
        KMP();
        printf("%d/n",cmp());
     }
}

 

 

下面是数据结构正中的kmp ,

 

#include <iostream>

using namespace
std;
int
t[1000001];
int
p[10001];
int
next[10001];

void
solve(int n)
{

    int
k = -1;
    int
i=0;
    next[0] = -1;
    while
(i<n)
    {

        while
(k>=0 && p[i] != p[k])
            k = next[k];
        i++;
        k++;
        if
(p[i] == p[k])
            next[i] = next[k];
        else

            next[i] = k;
    }
}


int
main()
{

    int
n;
    while
(scanf("%d",&n)!=EOF)
    {

        while
(n--)
        {

            int
a,b;
            scanf("%d%d",&a,&b);

            for
(int i=0;i<a;i++)
                scanf("%d",&t[i]);
            for
(int i=0;i<b;i++)
                scanf("%d",&p[i]);
            solve(b);
            int
k=0,j=0;
            while
(k<b && j<a)
            {

                if
(k == -1 || p[k] == t[j])
                    k++,j++;
                else

                    k = next[k];
            }

            if
(k>=b) cout<<j - b + 1<<endl;
            else

                cout<<"-1"<<endl;
        }
    }

    return
0;
}

原创粉丝点击