Number Sequence HDU 1711 KMP 模板

题目大意:两个数组匹配,求子串首次出现的位置。

题目思路:数组长度,比较大,朴素算法的时间复杂度为 m*n超时。KMP的时间复杂度为m+n可行。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<map>
#define INF 0x3f3f3f3f
#define MAX 1000005
#define Temp 1000000000
#define MOD 1000000007

using namespace std;

int num1[MAX],num2[MAX],n,m,Next[MAX];

void getNext()
{
    int k=-1,i=0;
    Next[0]=-1;
    while(i<m)
    {
        if(k==-1 || num2[i]==num2[k])
            Next[++i]=++k;
        else
            k=Next[k];
    }
}

int Kmp_index()
{
    getNext();
    int i=0,j=0;
    while(i<n && j<m)
    {
        if(j==-1 || num1[i]==num2[j])
        {
            i++;
            j++;
        }
        else
            j=Next[j];
    }
    if(j==m)
        return i-m+1;
    return -1;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            scanf("%d",&num1[i]);
        for(int i=0;i<m;i++)
            scanf("%d",&num2[i]);
        int ans=Kmp_index();
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted @ 2016-10-16 14:34  声声醉如兰  阅读(108)  评论(0编辑  收藏  举报