absi2011's Blog & Daily Life.

全新的开始       我要省选翻盘       I wanna AK in 高考\化学       自此,生无可恋
[破碎的状态] [-9] 最后9天的复习计划
[-6] 化学竞赛

[破碎的状态] [-9] Hdu 1711

absi2011 posted @ Jul 13, 2016 09:36:28 PM in 个人感想 with tags HDU KMP 小高考 , 545 阅读

又是一个kmp的模版题

求b数组在a中第一次出现的时间

直接上kmp

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<sstream>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int a[1000005],b[10005];
int fail[10005];
int main()
{
    int t;
    scanf("%d",&t);
    int zu;
    for (zu=0;zu<t;zu++)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int i;
        for (i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        for (i=0;i<m;i++)
        {
            scanf("%d",&b[i]);
        }
        fail[0]=-1;
        for (i=1;i<m;i++)
        {
            int t=fail[i-1];
            for (;;)
            {
                if (t==-1) break;
                if (b[t+1]==b[i])
                {
                    break;
                }
                t=fail[t];
            }
            if (b[t+1]==b[i])
            {
                t++;
            }
            fail[i]=t;
        }
        int now=-1;
        for (i=0;i<n;i++)
        {
            for (;;)
            {
                if (now==-1) break;
                if (b[now+1]==a[i])
                {
                    break;
                }
                now=fail[now];
            }
            if (b[now+1]==a[i])
            {
                now++;
            }
            if (now==m-1)
            {
                printf("%d\n",i-m+2);
                break;
            }
        }
        if (i>=n)
        {
            printf("-1\n");
        }
    }
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter