hdu 1171 史上最裸KMP

来源:互联网 发布:实木沙发推荐 知乎 编辑:程序博客网 时间:2024/05/24 07:06
/*通俗地讲,next[i]保存了以s[i]为结尾的后缀与模式串前缀的最长匹配数。*/#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=10002;const int maxm=1000002;int t,n,m;int a[maxm],b[maxn],next[maxn];void NEXT(){    int i,j=0,key=0;    memset(next,0,sizeof(next));    for(i=1;i<n;i++)    {        j=next[i-1];        while(j&&b[i]!=b[j])        j=next[j-1];        if(b[j]==b[i])        {            next[i]=j+1;        }        else next[i]=0;    }    return;}int KMP(){    int i,j=0,key;    for(i=0;i<m;i++)    {        while(j&&a[i]!=b[j])        j=next[j-1];        if(b[j]==a[i])        {            j++;        }        else j=0;        if(j==n)return i-n+2;    }    return -1;}int main(){    cin>>t;    while(t--)    {        cin>>m>>n;        int i,j;        for(i=0;i<m;i++)scanf("%d",&a[i]);        for(i=0;i<n;i++)scanf("%d",&b[i]);        NEXT();        cout<<KMP()<<endl;    }    return 0;}