【HDU1711 Number Sequence】 KMP

HDU1711
题意就是给你两个序列,让你求B序列在A序列第一次出现(完全相同)的下标
本题就是KMP的模板题,将i指针指向A串,将j指针指向B串,如果匹配就继续下一位的匹配,如果不匹配,将j跳转到next[j],继续向前匹配。
HDU1711代码

#include<stdio.h>
#include<iostream>
using namespace std ;
const int maxn = 1e6+5;
int Next[maxn];
int str[maxn];
int mo[maxn];
int n1,n2;
void GetNext()
{
    int i=0,j=-1;
    while(i<n2)
    {
        if(j==-1||mo[i]==mo[j]) {++i,++j,Next[i]=j;}
        else j=Next[j];
    }
    return ;
}
int kmp()
{
    int cnt=0;
    int i=0,j=0;
    while(i<n1)
    {
        if(j==-1||str[i]==mo[j]) i++,j++;
        else j=Next[j];//next数组寻找与当前后缀匹配最长的前缀,省略不必要的查找
        if(j==n2)
            return i-n2+1;//首地址
    }
    return -1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n1,&n2);
        for(int i=0;i<n1;i++) scanf("%d",&str[i]);
        for(int j=0;j<n2;j++) scanf("%d",&mo[j]);
        Next[0]=-1;
        GetNext();
        printf("%d\n",kmp());
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38891827/article/details/80501531