hdu 1711 Number Sequence(很简单的KMP)

来源:互联网 发布:数据安全管理指引 编辑:程序博客网 时间:2024/05/22 07:42

题目分析:



// KMP.cpp : Defines the entry point for the console application.//#include<iostream>#include<cstdio>using namespace std;int  a[1001000],b[11000],next[11000];void GetNext(int m)//很巧妙!?为神马可以这样实现{next[1]=0;int j=1,k=0;while(j<m){if((k==0)||b[j]==b[k]){j++,k++;next[j]=k;}else{k=next[k];}}}int main(){int t;cin>>t;while(t--){        int n,m,i,j;scanf("%d %d",&n,&m);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=1;i<=m;i++)scanf("%d",&b[i]);GetNext(m);int index,temp,flag=0,ans=-1;i=1,j=1;while(n-i+1>=m-j+1)//WA了一次:n-i+1>=m{           if(a[i]==b[j])   {   while(a[i]==b[j]&&j<=m)//      i++,j++;   if(j==m+1)   {   //cout<<i<<"***"<<j<<endl;   ans=(i-1)-m+1;   flag=1;   break;   }   }   else   {   j=next[j];   if(j==0)   i++,j++;   }}   printf("%d\n",ans);}//system("pause");return 0;}/*样例输入:213 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 1 313 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 2 16-1*/


原创粉丝点击