hdu1711
string情况下find更高效,奈何不一定是string啊
#include <cstring>
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e6 + 10;
int a[N], b[N];
int Next[N], f[N];
int n, m, k;
int KMP() {
Next[1] = 0;
for (int i = 2, j = 0; i <= n; i++) {
while (j > 0 && a[i] != a[j + 1]) j = Next[j];
if (a[i] == a[j + 1]) j++;
Next[i] = j;
}
for (int i = 1, j = 0; i <= m; i++) {
while (j > 0 && (j == n || b[i] != a[j + 1])) j = Next[j];
if (b[i] == a[j + 1]) j++;
f[i] = j;
}
for (int i = 1; i <= m; i++) {
if (f[i] == n) return i - n + 1;
}
return -1;
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &m, &n);
memset(Next, 0, sizeof Next);
memset(f, 0, sizeof f);
for (int i = 1; i <= m; i++) scanf("%d", &b[i]);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
k = KMP();
printf("%d\n", k);
}
return 0;
}