题目大意:两个数组匹配,求子串首次出现的位置。
题目思路:数组长度,比较大,朴素算法的时间复杂度为 m*n超时。KMP的时间复杂度为m+n可行。
#include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<stdio.h> #include<stdlib.h> #include<queue> #include<math.h> #include<map> #define INF 0x3f3f3f3f #define MAX 1000005 #define Temp 1000000000 #define MOD 1000000007 using namespace std; int num1[MAX],num2[MAX],n,m,Next[MAX]; void getNext() { int k=-1,i=0; Next[0]=-1; while(i<m) { if(k==-1 || num2[i]==num2[k]) Next[++i]=++k; else k=Next[k]; } } int Kmp_index() { getNext(); int i=0,j=0; while(i<n && j<m) { if(j==-1 || num1[i]==num2[j]) { i++; j++; } else j=Next[j]; } if(j==m) return i-m+1; return -1; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&num1[i]); for(int i=0;i<m;i++) scanf("%d",&num2[i]); int ans=Kmp_index(); printf("%d ",ans); } return 0; }