hdu 1711 Number Sequence

来源:互联网 发布:网络银行办理 编辑:程序博客网 时间:2024/05/16 00:59

kmp模板题。主要明确next数组的意义。 假设next[i]=x,则代表i之前的x个元素和从开头开始x个元素相等!

其实就是构造一个失配坐标组! 一旦匹配失败,进行合理的跳转来减少重复计算量。


#include"cstdio"#include"cstring"#include"cmath"#include"cstdlib"#include"iostream"#include"algorithm"#include"queue"using namespace std;int n,m;int a[1000002],b[10002];int next[12345];void getnext(int *t){    int i,j;    i=0;j=-1;    next[0]=-1;    while(i<m)    {        if(j==-1||t[i]==t[j])  next[++i]=++j;        else j=next[j];    }}int kmp(int *s,int *t){    int i,j;    i=j=0;    getnext(t);    while(i<n&&j<m)    {        if(j==-1||s[i]==t[j])        {            i++;j++;        }        else j=next[j];        if(j==m)        {            return i-m+1;        }    }    return -1;}int main(){    int t;    cin>>t;    while(t--)    {        int i;        cin>>n>>m;        for(i=0;i<n;i++) scanf("%d",&a[i]);        for(i=0;i<m;i++) scanf("%d",&b[i]);        printf("%d\n",kmp(a,b));    }}


0 0