hdu-1711(kmp)

题意:给你两串数字,问你第二串数字第一次出现在第一串数字的位置,没有输出-1;

解题思路:其是就是字符串匹配,就是这里是数字匹配,把char数组改成int型就可以了;

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define M 10050
#define N 1005000
using namespace std;
int next1[M];
int s[N];
int t[M];
int slen,tlen;
void get_next()
{
    int j,k;
    k=-1;j=0;next1[0]=-1;
    while(j<tlen)
    {
        if(k==-1||t[k]==t[j])
        {
            next1[++j]=++k;
        }
        else
            k=next1[k];
    }
}
int kmp_pos()
{
    int i,j;
    i=0;j=0;
    get_next();
    while(i<slen&&j<tlen)
    {
        if(j==-1||s[i]==t[j])
        {
            i++;j++;
        }
        else
            j=next1[j];
    }
    if(j==tlen)
        return i-tlen+1;
    return -1;
}
int main()
{
    int tt;
    scanf("%d",&tt);
    while(tt--)
    {
        scanf("%d%d",&slen,&tlen);
        for(int i=0;i<slen;i++)
            scanf("%d",&s[i]);
        for(int j=0;j<tlen;j++)
            scanf("%d",&t[j]);
        printf("%d\n",kmp_pos());
    }
}

  

posted @ 2018-07-08 17:18  荒岛的龟  阅读(84)  评论(0编辑  收藏  举报