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
Hint
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Maxsize 1000000
int next[Maxsize];
int a[2];
struct hh
{
int str[Maxsize];
int len;
};
void Getnext(struct hh *t,int next[])
{
int j=0,k=-1;
next[0]=-1;
while(j<t->len)
{
if(k==-1||t->str[j]==t->str[k])
{
k++;
j++;
if(t->str[j]!=t->str[k])
next[j]=k;
else
next[j]=next[k];
}
else
k=next[k];
}
}
int KMP(struct hh *s,struct hh *t)
{
int i=0,j=0,s1=0,y;
Getnext(t,next);
while(i<=s->len-t->len)//多次匹配来确定匹配是否唯一
{
j=0;
while(i<s->len&&j<t->len)
{
if(j==-1||s->str[i]==t->str[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>=t->len)//记录第一次匹配成功的位置
{
if(s1==0)
y=i;
s1++;
}
}
if(s1==1)
{
a[0]=y-t->len+1;
a[1]=y;
return 0;
}
else
return (-1);
}
int main()
{
struct hh *str1,*str2;
int i,x;
str1=(struct hh *)malloc(sizeof(struct hh));
str2=(struct hh *)malloc(sizeof(struct hh));
scanf("%d",&str1->len);
for(i=0;i<str1->len;i++)
scanf("%d",&str1->str[i]);
scanf("%d",&str2->len);
for(i=0;i<str2->len;i++)
scanf("%d",&str2->str[i]);
x=KMP(str1,str2);
if(x!=-1)
{
printf("%d %d\n",a[0],a[1]);
}
else if(x==-1)
printf("%d",x);
return 0;
}