当前位置: 代码迷 >> 综合 >> KMP / hdu 1711 [找到匹配的位置并返回]
  详细解决方案

KMP / hdu 1711 [找到匹配的位置并返回]

热度:25   发布时间:2023-12-14 10:34:08.0
kmp 很好,要熟练
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <bitset>
#include <list>
#include <map>
#include <set>
#include <iterator>
#include <algorithm>
#include <functional>
#include <utility>
#include <sstream>
#include <climits>
#include <cassert>
#define BUG puts("here!!!");using namespace std;
const int N = 1000005;
const int M = 10005;int s[N];
int t[M];
int next[M];
void getNext(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;
}
// abcabcababcabcabdef
// abcabcabd
int main() {int T, n, m, ans;cin >> T;while(T--) {cin >> n >> m;for(int i = 0; i < n; i++) {scanf("%d", s+i);}for(int i = 0; i < m; i++) {scanf("%d", t+i);}getNext(m);ans = kmp(n, m);cout << ans << endl;}return 0;
}
Sample Input
2
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 1 3
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 2 1
Sample Output
6
-1