KMP匹配算法 - Number Sequence
Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one.
Input
The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].
Output
For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.
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
------------------------------------------------------我是分割线^_^---------------------------------------------------
首先,我不得不说对这个算法还有很多的迷糊,不过已经会大概的模板的,记住kmppre的数组如何做
出来的就差不多了,就是当失去匹配时归回的匹配位置,路还有很远,哎= =
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<vector>
#include<cctype>
#include<set>
#include<map>
#include<sstream>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define INF 0x3f3f3f3f
#define Int __int64
#define pii pair<int,int>
#define check(x) cout<<"["<<x<<"]"<<endl;
const int MAXN = 1111111;
int num[MAXN];
int kmp_pre[MAXN];
int src[MAXN];
void Kmp_Pre(int num[], int len, int kmp_pre[]) {
int i = 0, j = 0;
j = kmp_pre[0] = -1;
while (i < len) {
while (j != -1 && num[i] != num[j]) {
j = kmp_pre[j];
}
kmp_pre[++i] = ++j;
}
}
int Kmp(int num[], int len1, int src[], int len2, int kmp_pre[]) {
int i = 0, j = 0;
Kmp_Pre(num, len1, kmp_pre);
while (i < len2) {
while (j != -1 && num[j] != src[i]) {
j = kmp_pre[j];
}
i++;
j++;
if (j == len1) {
return i - j + 1;
}
}
return -1;
}
int main() {
//freopen("input.txt", "r", stdin);
int T;
while (scanf("%d", &T) != EOF) {
while (T--) {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d", &src[i]);
}
for (int i = 0; i < m; i++) {
scanf("%d", &num[i]);
}
int ans = Kmp(num, m, src, n, kmp_pre);
printf("%d\n", ans);
}
}
return 0;
}