题意:
在a串中寻找第一个包含b串的的位置
思路:直接KMP即可
#include <cstdio> #define MAXN 1000010 using namespace std; void kmp_pre(int x[],int m,int next[]){ int i,j; j=next[0]=-1; i=0; while(i<m){ while(-1!=j&&x[i]!=x[j]) j=next[j]; if(x[++i]==x[++j]) next[i]=next[j]; else next[i]=j; } } int next[10010]; int kmp(int x[],int m,int y[],int n){ kmp_pre(x,m,next); int i,j; i=j=0; while(i<n){ while(-1!=j&&y[i]!=x[j]) j=next[j]; ++i,++j; if(j>=m){ return i-m+1; } } return -1; } int y[MAXN]; int x[10010]; int n,m; int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i=0;i<n;++i) scanf("%d",&y[i]); for(int i=0;i<m;++i) scanf("%d",&x[i]); printf("%d\n",kmp(x,m,y,n)); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-08 14:14:29