数据结构实验之串三:
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
示例输出
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>
int a[1000000];
int b[1000000];
int next[1000000];
void get_next(int b[],int m);
void kmp(int a[],int b[],int n,int m);
int main()
{
int n,m;
int 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]);
}
get_next(b,m);
kmp(a,b,n,m);
return 0;
}
void get_next(int b[],int m)
{
int i,j;
next[0] = next[1] = 0;
i = j = 0;
for(i=1;i<m;i++)
{
j = next[i];
while( j && b[i]!=b[j])
{
j = next[j];
}
next[i+1] = b[i]==b[j] ? j+1 : 0;
}
next[0] = -1;
}
void kmp(int a[],int b[],int n,int m)
{
int i ,j ,cnt ,left,right;
i = j = 0;
cnt = 0;
while( i < n && j < m)
{
if(j==-1 || a[i] == b[j])
{
i++;
j++;
}
else
{
j = next[j];
}
if(j == m) //如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1
{
cnt++;
j = 0;//置0,判断剩余部分是否还有b[]
if(cnt == 1) //已经找到一对l,r
{
left = i - m + 1;//记录此时的下标
right = i;
}
}
}
if(cnt == 1)
printf("%d %d\n",left,right);
else
printf("-1\n");
}