您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之串三:KMP应用

2016-08-05 20:38 316 查看


数据结构实验之串三: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



提示

  这个题目有bug ,而且有很大的bug,首先数组的大小1100000;还有要注意哦!给的第二组数据只能在第一组中出现一次,否则-1;

bug 是你可以尝试一下

5

1 2 2 2 3

2

2 2

答案可以是-1;也可以是2 3;提交上都ac;

而我这个代码输出是2 3;
#include <stdio.h>
#include <string.h>
int next[1100000],n,m;
int s[1100000],l[1100000];
void getnext(int s[])
{
int i=0;
int j=-1;
next[0]=-1;
while(i<m)
{
if(j==-1||s[i]==s[j])
{
i++;
j++;
if(s[i]!=s[j])///这是优化的部分,也可以是next[i]=j;
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
}
}
void kmp(int l[],int s[])
{
int i=0;
int j=0;
int f=0;
int lr,ll;
getnext(s);
while(i<n)
{
if(j==-1||l[i]==s[j])
{
i++;
j++;
}
else
j=next[j];
if(j==m)///标记只出现一次
{
f++;
if(f==1)
{
ll=i-m+1;
lr=i;
}
}
}
if(f==1)
printf("%d %d\n",ll,lr);
else
printf("-1\n");
}
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&l[i]);
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&s[i]);
kmp(l,s);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: