KMP 模版题,求子串第一次出现的位置
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
using namespace std;
int n, m;
int next[10005];
int a[1000005], b[10005];
void kmp_pre(int x[],int m,int nextt[]){
int i, j;
j = nextt[0] = -1;
i = 0;
while(i < m){
while(-1!=j && x[i]!=x[j])
j = nextt[j];
nextt[++i] = ++j;
}
}
int KMP_Index(int x[], int m, int y[], int n){
int i = 0, j = 0;
kmp_pre(x, m, nextt);
while(i < n && j < m){
if(j == -1 || y[i] == x[j]){
i++; j++;
}
else
j = nextt[j];
}
if(j == m)
return i-m;
else
return -1;
}
int main(){
//freopen("a.txt", "r", stdin);
int t; cin >> t;
while(t--){
int tem;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
for(int i = 0; i < m; i++){
scanf("%d", &b[i]);
}
int ans = KMP_Index(b, m, a, n);
if(ans == -1) cout << "-1" << endl;
else cout << ans+1 << endl;
}
return 0;
}