hdu 1711 Number Sequence

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值