Number Sequence(HDU 1711 KMP)

来源:互联网 发布:淘宝钻级店铺转让 编辑:程序博客网 时间:2024/06/08 03:37

Number Sequence

Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)

Problem Description
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
213 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 1 313 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 2 1
 

Sample Output
6-1
 

//题意:若b[]是a[]的子串,求b[0]在a[]中的位置。

//思路:KMP算法模板

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cmath>#include <algorithm>using namespace std;int n, m;int a[1000005], b[10005];int Next[1000005];void GetNext(){Next[0] = 0;Next[1] = 0;for (int i = 1; i < n; i++){int j = Next[i];while (j&&b[i] != b[j]){j = Next[j];}Next[i + 1] = b[i] == b[j] ? j + 1 : 0;}}int kmpSearch(){int i, j = 0;for (int i = 0; i < n; i++){while (j&&a[i] != b[j]){j = Next[j];}if (a[i] == b[j]){j++;}if (j == m)return i - m + 1;}return -1;}int main(){int T;cin >> T;while (T--){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]);}if (m > n){printf("-1\n");continue;}GetNext();int ans = kmpSearch();if (ans == -1){printf("-1\n");}else{printf("%d\n", ans + 1);}}return 0;}





原创粉丝点击