数据结构实验之串三:KMP应用
Time Limit: 1000MS Memory limit: 65536K
题目描述
有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?
输入
首先输入一个整数n,代表有n个小朋友。(0
输出
如果能
唯一
的确定一对l,r的值,那么输出这两个值,否则输出-1
示例输入
5 1 2 3 4 5 3 2 3 4
示例输出
2 4
#include <stdio.h>
#include <stdlib.h>
int a[100000010],b[100000010];
int next[100000010];
void getnext(int b[], int m)
{
int i=0;
next[0]=-1;
int j=-1;
while(i<m)
{
if(j==-1||b[i]==b[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
}
int kmp(int a[], int b[], int m, int n)
{
int i=0, j=0;
getnext(b, m);
while(i<n&&j<m)
{
if(j==-1||a[i]==b[j])
{
i++;
j++;
}
else j=next[j];
}
if(j>=m) return i;
else
return -1;
}
int main()
{
int n, m, i;
scanf("%d", &n);
for(i=0; i<n; i++)
scanf("%d", &a[i]);
scanf("%d", &m);
for(i=0;i<m;i++)
scanf("%d", &b[i]);
int e = kmp(a, b, m, n);
if(e==-1) printf("%d", e);
else //注意题目中的唯一
{
int t = kmp(a+e, b, m, n);//看是否有重复的子串
if(t==-1)
printf("%d %d", e-m+1, e);
else
printf("-1");
}
return 0;
}