hdu 1711 Number Sequence (KMP - 初步)
来源:互联网 发布:虚拟机mac os x 10.11 编辑:程序博客网 时间:2024/06/06 19:06
#include <iostream>#include <cstring>#include <string>#include <cstdio>using namespace std;const int N = 1000005;const int M = 10005;int s[N];int t[M];int next[M];void get_next(int len) { int i, j; i = 0, j = -1; next[0] = -1; while(i < len-1) { if(j == -1 || t[i] == t[j]) { i++, j++; next[i] = j; } else { j = next[j]; } }}int kmp(int sl, int tl) { int i = 0, j = 0; while(i < sl && j < tl) { if(j == -1 || s[i] == t[j]) { i++, j++; } else { j = next[j]; } } if(j == tl) { return i - j + 1; } else return -1;}int main() { int T, n, m, ans; cin >> T; while(T--) { scanf("%d%d", &n, &m); int i; for(i = 0; i < n; i++) { scanf("%d", s+i); } for(i = 0; i < m; i++) { scanf("%d", t+i); } get_next(m); ans = kmp(n, m); printf("%d\n", ans); } return 0;}