hdu 1711Number Sequence

http://acm.hdu.edu.cn/showproblem.php?pid=1711

Number Sequence

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


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
View Code
 1 #include<stdio.h>
 2 int F[1000010];
 3 int S[10010];
 4 int n;
 5 int m;
 6 int next[10010];
 7 void get_next()
 8 {
 9     int i=1;
10     int j=0;
11     next[1]=0;
12     while(i<m)
13     {
14         if(j==0||S[i]==S[j])
15         {
16             i++;
17             j++;
18             next[i]=j;
19         }
20         else j=next[j];
21     }
22     
23 }
24 int kmp()
25 {
26     int i=1;
27     int j=1;
28     int flag=1;
29     while(i<=n&&j<=m)
30     {
31         
32         if(j==0||F[i]==S[j])
33         {
34             i++;
35             j++;
36         }
37         else j=next[j];
38         if(j>m)
39         {
40             flag=0;
41             printf("%d\n",i-j+1);
42             break;
43         }
44     }
45     if(flag) printf("-1\n");
46     
47 }
48 int main()
49 {
50     int t;
51     int i,j;
52     scanf("%d",&t);
53     while(t--)
54     {
55         scanf("%d%d",&n,&m);
56         for(i=1;i<=n;i++)
57         scanf("%d",&F[i]);
58         for(i=1;i<=m;i++)
59         scanf("%d",&S[i]);
60         get_next();
61         kmp();
62     }
63 }

 

posted on 2012-08-02 19:25  仁者无敌8勇者无惧  阅读(145)  评论(0编辑  收藏  举报

导航