SDUT 3311 数据结构实验之串三:KMP应用

数据结构实验之串三:KMP应用

Time Limit: 1000MS Memory Limit: 65536KB

Problem Description

有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?

Input

首先输入一个整数n,代表有n个小朋友。下一行输入n个数,分别代表每个小朋友手里糖的数量。

之后再输入一个整数m,代表下面有m个数。下一行输入这m个数。

Output

 如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1

Example Input

5
1 2 3 4 5
3
2 3 4

Example Output

2 4

DQE:

 
KMP算法的简单应用,注意本题要求有唯一解,熟悉判断唯一解的方法即可,水题++;
 
 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 void cnext(int *y,int *next)
 5 {
 6     int i=1,j=0;
 7     next[i]=j;
 8     while(i<y[0])
 9     {
10         if(j==0||y[i]==y[j])
11         {
12             i++;
13             j++;
14             next[i]=j;
15         }
16         else
17         {
18             j=next[j];
19         }
20     }
21 }
22 
23 int kmp(int *x,int *y,int *next,int pos)
24 {
25     int i=pos,j=1;
26     while(i<=x[0]&&j<=y[0])
27     {
28         if(j==0||x[i]==y[j])
29         {
30             i++;
31             j++;
32         }
33         else
34         {
35             j=next[j];
36         }
37     }
38     if(j>y[0])
39         return i-y[0];
40     return -1;
41 }
42 
43 int main()
44 {
45     static int x[1000001],y[1000001];
46     static int next[1000001];
47     int i,j;
48     while(scanf("%d",x)!=EOF)
49     {
50         for(i=1;i<=x[0];i++)
51         {
52             scanf("%d",&x[i]);
53         }
54         scanf("%d",y);
55         for(i=1;i<=y[0];i++)
56         {
57             scanf("%d",&y[i]);
58         }
59         cnext(y,next);
60         i=kmp(x,y,next,1);
61         if(i!=-1)
62         {
63             j=kmp(x,y,next,1+i);
64             if(j==-1)
65             {
66                 printf("%d %d\n",i,i+y[0]-1);
67             }
68             else
69             {
70                 printf("-1\n");
71             }
72         }
73         else
74         {
75             printf("-1\n");
76         }
77     }
78     return 0;
79 }
80 
81 /***************************************************
82 User name: ***
83 Result: Accepted
84 Take time: 172ms
85 Take Memory: 1304KB
86 Submit time: 2016-11-02 21:35:25
87 ****************************************************/

 

posted @ 2016-11-04 22:43  Leroscox  阅读(424)  评论(0编辑  收藏  举报