#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int M = 10010;
const int MAX = 1000010;
int next[M];
int a[MAX];
int b[M];
int n, m;
void get_next(int len){
int i, j;
i = 0;
j = -1;
next[0] = -1;
while(i < len-1){
if(j == -1 || b[i] == b[j]){
i++; j++;
next[i] = j;
}
else{
j = next[j];
}
}
}
int kmp(){
int i, j;
i = j = 0;
while(i < n && j < m) {
if(j == -1 || a[i] == b[j]){
i++; j++;
}
else{
j = next[j];
}
}
if(j == m){
return i-j+1;
}
return -1;
}
int main()
{
int count;
scanf("%d", &count);
for(int k = 0; k < count; k++) {
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);
}
get_next(m);
int ans = kmp();
printf("%d\n", ans);
}
return 0;
}
hdu1711(kmp)
最新推荐文章于 2021-04-06 14:09:40 发布