HDU1711 Number Sequence

来源:互联网 发布:网络性能指标并发 编辑:程序博客网 时间:2024/05/17 03:39

题目大意:给你两个序列a和b,让判断b是否是a的子串,如果是,找出在a中的位置,否则输出-1.


分析:裸KMP。


实现代码如下:

#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int MAX=1000010;int next[10010],n,m;int a[MAX],b[10010];void init_next(){    int i=0,j=-1;    next[0]=-1;    while(i<m)    {        if(j==-1||b[i]==b[j])        {            i++;            j++;            next[i]=j;        }        else j=next[j];    }}int solve(){    int i=0,j=0,ans=0;    while(i<n)    {        if(j==-1||a[i]==b[j])        {            i++;j++;        }        else j=next[j];        if(j==m)        {            ans=i+1;            break;        }    }    if(i==n&&j!=m)  ans=m-1;//一直忘了加j!=m这句,老WA。。这是排除b正好是a的后缀。    return ans-m;}int main(){    int t;    cin>>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]);        init_next();        printf("%d\n",solve());    }    return 0;}


0 0