https://vjudge.net/problem/HDU-1711
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5, MAXM = 1e4 + 5;
int n, m;
int a[MAXN], b[MAXM];
int nxt[MAXM];
void preKMP() {
int i, j;
j = nxt[0] = -1;
i = 0;
while (i < m) {
while (j != -1 && b[j] != b[i])
j = nxt[j];
nxt[++i] = ++j;
}
}
int KMP() {
preKMP();
int i, j;
i = j = 0;
while (i < n) {
while (j != -1 && b[j] != a[i])
j = nxt[j];
++i, ++j;
if (j == m)
return i + 1 - m;
}
return -1;
}
int main() {
int q;
scanf("%d", &q);
while (q--) {
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]);
printf("%d\n", KMP());
}
return 0;
}