Number Sequence

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6050    Accepted Submission(s): 2721


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
 1 /* 功能Function Description:     HDOJ-1711
 2    开发环境Environment:          DEV C++ 4.9.9.1
 3    技术特点Technique:
 4    版本Version:
 5    作者Author:                   可笑痴狂
 6    日期Date:                      20120814
 7    备注Notes:
 8         -------KMP
 9 */
10 #include<stdio.h>
11 
12 int a[1000005],b[10005];
13 int next[10005];
14 
15 void get_next(int m)
16 {
17     int i,j;
18     i=0;
19     j=-1;
20     next[0]=-1;
21     while(i<m)
22     {
23         if(b[i]==b[j]||j==-1)
24         {
25             ++i;
26             ++j;
27             next[i]=j;
28         }
29         else
30             j=next[j];
31     }
32 }
33 
34 int kmp(int n,int m)
35 {
36     int i=0,j=0;
37     while(i<n)
38     {
39         if(j==-1||a[i]==b[j])
40         {
41             ++i;
42             ++j;
43         }
44         else
45             j=next[j];
46         if(j==m)
47         {
48             return i-m+1;
49         }
50     }
51     return -1;
52 }
53 
54 int main()
55 {
56     int T,m,n,i;
57     scanf("%d",&T);
58     while(T--)
59     {
60         scanf("%d%d",&n,&m);
61         for(i=0;i<n;++i)
62             scanf("%d",&a[i]);
63         for(i=0;i<m;++i)
64             scanf("%d",&b[i]);
65         get_next(m);
66         printf("%d\n",kmp(n,m));
67     }
68     return 0;
69 }

 

posted on 2012-08-14 11:09  可笑痴狂  阅读(333)  评论(0编辑  收藏  举报