http://acm.hust.edu.cn/vjudge/contest/view.action?cid=92486#problem/A
Number Sequence
Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
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
题意:在a串中找b串的位置,多个输出最小or输出-1
最简单kmp……wa哭N次,最后在大牛下终于1a
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 #define maxn 10008 8 9 int n, m, a[maxn*100], b[maxn], Next[maxn]; 10 11 void getnext() 12 { 13 int j, k; 14 j = 0; 15 k = Next[0] = -1; 16 while(j < m) 17 { 18 if(k == -1 || b[j] == b[k]) 19 { 20 j++; 21 k++; 22 Next[j] = k; 23 } 24 else 25 k = Next[k]; 26 } 27 } 28 29 void slove() 30 { 31 int j; 32 j = 0; 33 int ans = -1; 34 for(int i = 0; i < n; ) // i 不该加就不要加,你用while多好……=。=|| 35 { 36 while(j == -1 || (a[i] == b[j] && i < n && j < m)) 37 i++, j++; 38 if(j == m) 39 { 40 ans = i - j + 1; 41 break; 42 } 43 j = Next[j]; 44 } 45 printf("%d ", ans); 46 } 47 48 int main() 49 { 50 int t; 51 scanf("%d", &t); 52 while(t--) 53 { 54 scanf("%d%d", &n, &m); 55 for(int i = 0; i < n; i++) 56 scanf("%d", &a[i]); 57 for(int i = 0; i < m; i++) 58 scanf("%d", &b[i]); 59 getnext(); 60 slove(); 61 } 62 return 0; 63 }
刘大大说要用函数……无论多短的代码
说的是