http://acm.hdu.edu.cn/showproblem.php?pid=1711
Number Sequence
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
Recommend
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <algorithm> #include <iostream> #include<cstdio> #include<string> #include<cstring> #include <stdio.h> #include <string.h> using namespace std; int a[1000009] ; int b[100009]; void getnext(int *b , int len , int *next)//next是记录字符串的每个字符的之前的字符串的最长的前缀与后缀 { next[0] = -1;//将next数组右移一项使与查找时下标匹配 int j = 0 , k = -1 ; while(j < len - 1) { if(k == -1 || b[k] == b[j]) { k++; j++; next[j] = k ; } else { k = next[k]; } } } int main() { int t ; cin >> t ; while(t--) { int next[100009]; int n , m ; 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]); } getnext(b , m , next);//求next数组 int i = 0 , j = 0; while(i < n && j < m) { if(j == -1 || a[i] == b[j]) { j++ ; i++ ; } else { j = next[j];//文本i不动,b串移动到最长前缀与后缀的长度下标 } } if(j == m) printf("%d " , i - j + 1); else printf("-1 "); } return 0 ; }