Number Sequence
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15068 Accepted Submission(s):
6606
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
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
Source
HDU
2007-Spring Programming Contest
Recommend
lcy | We have carefully selected several similar
problems for you: 1358 3336 3746 1251 2222
RE:从s串中如果能找出p串,则输出p串在s串的位置;
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 int a[1000005], b[10005]; 6 int p[1000005]; 7 int n, m; 8 void Getp() //对 b[] 求 p[] ; 9 { 10 int i = 0, j = -1; 11 p[i] = j; 12 while(i < m) 13 { 14 if(j == -1 || b[i] == b[j]) 15 { 16 i++; j++; 17 p[i] = j; 18 } 19 else 20 j = p[j]; 21 } 22 } 23 int Kmp() 24 { 25 int i = 0, j = 0; 26 while(i < n) 27 { 28 if(j == -1 || a[i] == b[j]) 29 { 30 i++, j++; 31 if(j == m) 32 return i -j + 1; 33 } 34 else 35 j = p[j]; 36 } 37 return -1; 38 } 39 int main() 40 { 41 int t; 42 scanf("%d", &t); 43 while(t--) 44 { 45 int i; 46 scanf("%d %d", &n, &m); 47 for(i = 0; i < n; i++) 48 scanf("%d", &a[i]); 49 for(i = 0; i < m; i++) 50 scanf("%d", &b[i]); 51 Getp(); 52 printf("%d\n", Kmp()); 53 } 54 return 0; 55 }