基础KMP题,本文提供一段能AC并且便于调试以及查看next数组的代码。
参考博客
http://blog.youkuaiyun.com/v_july_v/article/details/7041827
代码参考lrj训练指南P212
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e6+7; int P[N],T[N]; int m,n; int f[N]; int KMP(int P[],int T[],int f[]) { f[0]=-1,f[1]=0; for(int i=1,j=0;i<m;i++) { while(j&&P[i]!=P[j]) j=f[j]; f[i+1]=(P[i]==P[j]? ++j:0); } for(int i=0,j=0;i<n;i++) { while(j&&T[i]!=P[j]) j=f[j]; if(T[i]==P[j]) j++; if(j==m) return i-j+1; } return -2; } int main() { int TT; scanf("%d",&TT); while(TT--) { scanf("%d%d",&n,&m); for(int i=0; i<n; i++) scanf("%d",&T[i]); for(int i=0; i<m; i++) scanf("%d",&P[i]); printf("%d\n",KMP(P,T,f)+1); } }