模式串匹配模板题
题目代码
#include<stdio.h> #include<string.h> using namespace std; const int maxn=1e6+7; const int maxm=1e4+7; int a[maxn],b[maxm],n,m,nxt[maxm],t; void GetNext(){ int j=0,k=-1; nxt[0]=-1; while(j<m){ if(k==-1||b[j]==b[k]){ j++;k++; nxt[j]=k; } else k=nxt[k]; } } int KmpSearch(){ int i=0,j=0; int root=0; while(i<n&&j<m){ if(j==-1||a[i]==b[j]){ i++,j++; } else j=nxt[j]; } if(j==m)return i-j+1; else return -1; } int main(){ scanf("%d",&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]); GetNext(); printf("%d\n",KmpSearch()); } return 0; }