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

时间:2023-03-08 17:56:58
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算法的简单应用,注意本题要求有唯一解,熟悉判断唯一解的方法即可,水题++;
 #include <iostream>
 #include <cstdio>

 void cnext(int *y,int *next)
 {
     ,j=;
     next[i]=j;
     ])
     {
         ||y[i]==y[j])
         {
             i++;
             j++;
             next[i]=j;
         }
         else
         {
             j=next[j];
         }
     }
 }

 int kmp(int *x,int *y,int *next,int pos)
 {
     ;
     ]&&j<=y[])
     {
         ||x[i]==y[j])
         {
             i++;
             j++;
         }
         else
         {
             j=next[j];
         }
     }
     ])
         ];
     ;
 }

 int main()
 {
     ],y[];
     ];
     int i,j;
     while(scanf("%d",x)!=EOF)
     {
         ;i<=x[];i++)
         {
             scanf("%d",&x[i]);
         }
         scanf("%d",y);
         ;i<=y[];i++)
         {
             scanf("%d",&y[i]);
         }
         cnext(y,next);
         i=kmp(x,y,next,);
         )
         {
             j=kmp(x,y,next,+i);
             )
             {
                 printf(]-);
             }
             else
             {
                 printf("-1\n");
             }
         }
         else
         {
             printf("-1\n");
         }
     }
     ;
 }

 /***************************************************
 User name: ***
 Result: Accepted
 Take time: 172ms
 Take Memory: 1304KB
 Submit time: 2016-11-02 21:35:25
 ****************************************************/