Problem Description
有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?
Input
首先输入一个整数n,代表有n个小朋友。下一行输入n个数,分别代表每个小朋友手里糖的数量。
之后再输入一个整数m,代表下面有m个数。下一行输入这m个数。
Output
如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1
Sample Input
代码语言:javascript复制5
1 2 3 4 5
3
2 3 4
Sample Output
代码语言:javascript复制2 4
代码语言:javascript复制#include <stdio.h>
#include <string.h>
using namespace std;
int text[11234567];
int pattern[11234567];
int n,m;
void get(int pattern[], int next[])
{
int i = 0,j = -1;
next[0] = -1;
while(i < n){
if(j == -1||pattern[i]==pattern[j]){
i ;
j ;
next[i] = j;
}else{
j = next[j];
}
}
}
int kmp(int text[], int pattern[])
{
int next[n 1];
get(pattern,next);
int i = 0,j = 0,index = 0;
while(i<n&&j<m){
if(text[i]==pattern[j]){
i ;
j ;
}else{
index =j-next[j];
if(next[j]!=-1){
j = next[j];
}else{
i ;
j = 0;
}
}
}
if(j == m){
return index 1;
}else{
return -1;
}
}
int main()
{
while(~scanf("%d", &n)){
for(int i = 0;i <n;i ){
scanf("%d", &text[i]);
}
scanf("%d", &m);
for(int i = 0;i <m;i ){
scanf("%d", &pattern[i]);
}
int t = kmp(text, pattern);
if(t == -1){
printf("-1n");
}else{
int tt = kmp(text t,pattern);
if(tt==-1){
printf("%d %dn", t,t m-1);
}else{
printf("-1n");
}
}
}
return 0;
}