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

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
kmp 基础
代码:
 1 /*@kmp扩展@龚细军*/
 2 #include<stdio.h>
 3 #include<string.h>
 4 int aa[1000004],bb[10005];
 5 int next[10005];
 6 //依旧使用next数组
 7 void get_next(int *pt,int len)
 8 {
 9     memset(next,0,sizeof(next));
10     int i=0,j=-1;
11     next[0]=-1;
12     while(i<len)
13     {
14         if(j==-1||pt[i]==pt[j])
15         {
16          ++i;
17          ++j;
18          if(pt[i]!=pt[j])
19              next[i]=j;
20          else
21              next[i]=next[j];
22         }
23         else
24             j=next[j];
25     }
26 }
27 //kmp的扩展
28 int exd_kmp(int *ps,int *pt,int lens,int lent)
29 {
30     int i=-1,j=-1;
31     get_next(pt,lent);
32     while(i<lens)
33     {
34         if(j==-1||ps[i]==pt[j])
35         {
36             ++i;
37             ++j;
38         }
39         else
40             j=next[j];
41      if(j==lent)break;
42     }
43     if(j==lent)
44         return i-j+1;
45     else
46         return -1;
47 }
48 
49 int main()
50 {
51     int test,n,m,i;
52     scanf("%d",&test);
53     while(test--)
54     {
55         scanf("%d%d",&n,&m);
56         for(i=0;i<n;i++)
57             scanf("%d",&aa[i]);
58         for(i=0;i<m;i++)
59             scanf("%d",&bb[i]);
60         printf("%d\n",exd_kmp(aa,bb,n,m));
61     }
62     return 0;
63 }
View Code

 

 java代码:

相关文章:

  • 2021-11-03
  • 2021-09-17
  • 2021-06-28
  • 2021-06-28
  • 2021-11-21
  • 2022-02-19
  • 2021-11-29
  • 2021-06-10
猜你喜欢
  • 2021-09-20
  • 2021-11-15
  • 2022-01-24
  • 2021-09-26
  • 2021-08-28
  • 2021-10-24
  • 2021-11-17
相关资源
相似解决方案