#include<bits/stdc++.h>
using namespace std;
int T,n,m;const int N=1e6+10;
int s[N],t[N];vector<int> nxt;
vector<int> getnxt() {
int n = m;
vector<int> pi(n);
for (int i = 1; i < n; i++) {
int j = pi[i - 1];
while (j > 0 && t[i] != t[j]) j = pi[j - 1];
if (t[i] == t[j]) j++;
pi[i] = j;
}
return pi;
}
void KMP_Count() {//x为模式串
int fl=0;
for(int i = 0, j = 0; i < n; ++i){
while(j && s[i] != t[j]) j = nxt[j-1];
if(s[i] == t[j]) j++;
if(j == m){
cout<<i-m+2<<endl;fl=1;break;
j = nxt[j-1];
}
}
if(fl==0){cout<<-1<<endl;}
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&s[i]);
for(int i=0;i<m;i++) scanf("%d",&t[i]);
nxt=getnxt();
// for(int i=0;i<nxt.size();i++) cout<<nxt[i]<<endl;
// cout<<nxt.size()<<endl;
KMP_Count();
}
}
Number Sequence (字符串匹配,KMP算法)
最新推荐文章于 2022-03-14 18:13:28 发布