题意:给你两个数组,求第二个数组在第一个数组中的位置,若不存在,则输出-1.
#include <cstdio> #include <cmath> #include <iostream> #include <string.h> #include <algorithm> using namespace std; int d[10005]; int f[1000005]; int Next[20005]; void KMP(int s[],int len) { int n=len,i,j; memset(Next,0,sizeof(Next)); for(i=1;i<n;i++) { j=Next[i-1]; while(j>0&&s[i]!=s[j]) j=Next[j-1]; if(s[i]==s[j]) j++; Next[i]=j; } return ; } int main() { int i,j,k,m,n,ans,T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%d",&f[i]); for(i=0;i<m;i++) scanf("%d",&d[i]); KMP(d,m); ans=-1; for(i=0,j=0;i<n;i++) { while(j>0&&d[j]!=f[i]) j=Next[j-1]; if(f[i]==d[j]) j++; if(j==m) { ans=i-m+2; break; } } printf("%d\n",ans); } return 0; }
时间: 2024-11-02 08:30:10