数据结构实验之串三: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 ",i,i+y[0]-1); 67 } 68 else 69 { 70 printf("-1 "); 71 } 72 } 73 else 74 { 75 printf("-1 "); 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 ****************************************************/