Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
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
5 1 2 3 4 5 3 2 3 4
Sample Output
2 4
Hint
#include
#include
#include
int m, n, next[1000001], t[1000001], p[1000001]; //一开始数组开小了一个0,结果WA
void setNext() //建立next数组
{
int j, k;
j = 0;
k = -1;
next[0] = -1;
while(j < m)
{
if(k < 0 || p[j] == p[k])
{
k++;
j++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
void kmp() //kmp算法
{
int i = 0, j = 0, flag = 0, l, r;
while(i < n)
{
if(j < 0 || t[i] == p[j])
{
i++;
j++;
}
else
{
j = next[j];
}
if(j == m)
{
flag++;
if(flag >= 2) //如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1
//唯一确定
{
break;
}
l = i - m + 1;
r = i;
}
}
if(flag == 1)
{
printf("%d %d\n", l, r);
}
else
{
printf("-1\n");
}
}
int main(void)
{
scanf("%d", &n);
int i;
for(i = 0; i < n; i++)
{
scanf("%d", &t[i]);
}
scanf("%d", &m);
for(i = 0; i < m; i++)
{
scanf("%d", &p[i]);
}
setNext();
kmp();
return 0;
}