hdu 1711 Number Sequence(KMP算法)

题意:KMP匹配,返回模式串第一次与主串匹配的位置。

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

#define MAXN 10005//字符串长度

int a[1000005];
int b[MAXN];

int _next[MAXN];

void GetNext(int t[],int M) //求next数组
{
    int j,k,len;
    j=0;//从0开始,首先求_next[1]
    k=-1;//比较指针
    _next[0]=-1;//初始值-1
    //len=strlen(t);
    len=M;
    while(j<len)
    {
        if(k==-1||t[j]==t[k]) //指针到头了,或者相等
        {
            ++j;
            ++k;
            _next[j]=k;//此句可由优化替代
            /*优化(求匹配位置时可用)
            if(t[j]!=t[k])_next[j]=k;
            else _next[j]=_next[k];
            //*/
        }
        else k=_next[k];
    }
}

int KMPIndex(int s[],int t[],int N,int M) //求子串首次出现在主串中的位置
{
    int i,j,lens,lent;
    i=j=0;
    //lens=strlen(s);
    //lent=strlen(t);
    lens=N;
    lent=M;

    while(i<lens&&j<lent)//j<lent条件,当子串首次和主串匹配时,则退出循环
    {
        if(j==-1||s[i]==t[j])
        {
            ++i;
            ++j;
        }
        else j=_next[j];
    }
    if(j>=lent)return i-lent+1;
    else return -1;
}

int main()
{
    int T;
    int N,M;

    scanf("%d",&T);

    while(T--)
    {
        scanf("%d%d",&N,&M);

        for(int i=0; i<N; ++i)
        {
            scanf("%d",&a[i]);
        }
        for(int i=0; i<M; ++i)
        {
            scanf("%d",&b[i]);
        }

        GetNext(b,M);
        printf("%d\n",KMPIndex(a,b,N,M));
    }
    return 0;
}


你可能感兴趣的:(hdu 1711 Number Sequence(KMP算法))