题面
https://vjudge.net/problem/HDU-1711
题解
#include<cstdio> #include<iostream> #include<cstring> #define ri register int #define N 1000500 using namespace std; int T,nex[N],n,m; int s[N],t[N]; void getnex(){ nex[0]=nex[1]=0; for (ri i=2;i<=n;i++) { int j=nex[i-1]; while (j && s[j+1]!=s[i]) j=nex[j]; if (s[j+1]==s[i]) nex[i]=j+1; else nex[i]=0; } } int main(){ scanf("%d",&T); while (T--) { scanf("%d",&m);scanf("%d",&n); for (ri i=1;i<=m;i++) scanf("%d",&t[i]); for (ri i=1;i<=n;i++) scanf("%d",&s[i]); getnex(); int k=0; bool ss=0; for (ri i=1;i<=m;i++) { while (k && s[k+1]!=t[i]) k=nex[k]; if (s[k+1]==t[i]) { k++; if (k==n) { k=nex[k]; printf("%d\n",i-n+1); ss=1; break; } } } if (!ss) puts("-1"); } return 0; }
原文:https://www.cnblogs.com/shxnb666/p/11279657.html