HDU 1711 Number Sequence(KMP模板)

来源:互联网 发布:无root修改手机mac地址 编辑:程序博客网 时间:2024/06/09 20:07

题意不多述,下午看了半个多小时kmp总算懂了,不过明明大多数都是前缀...数组名非得开成next这么让人容易误会...所以我用了pre这个数组名。

假设pre[i]=x,则代表i之前的x个元素和从开头开始x个元素相等。

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>using namespace std;int a[1002000],b[10020];int pre[10020];//前缀数组,pre[i]代表b数组中从第i个元素开始有pre[i]个元素和开头相等int n,m;void getpre(){    int i=0,j=-1;    pre[0]=-1;    while(i<m)    {        if(j==-1||b[i]==b[j])            pre[++i]=++j;        else            j=pre[j];    }}int kmp(){    int i=0,j=0;    getpre();    while(i<n&&j<m)    {        if(j==-1||a[i]==b[j])        {            i++;j++;        }        else            j=pre[j];        if(j==m)            return i-m+1;    }    return -1;}int main(){    int t;    cin>>t;    while(t--)    {        cin>>n>>m;        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        for(int i=0;i<m;i++)            scanf("%d",&b[i]);        printf("%d\n",kmp());    }    return 0;}


0 0
原创粉丝点击