Number Sequence

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
Submit Status

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 }

刘大大说要用函数……无论多短的代码    

说的是

原文地址:https://www.cnblogs.com/Tinamei/p/4833336.html