数据结构实验之串三: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; }
相关文章推荐
- 数据结构实验之串一:KMP简单应用
- sdut 3311 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用 (sdut oj2772)
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用
- SDUT 2272 数据结构实验之串一:KMP简单应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串一:KMP简单应用
- SDUTACM 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用
- KMP算法 --数据结构实验之串一:KMP简单应用
- 数据结构实验之串三:KMP应用
- SDUTACM 数据结构实验之串一:KMP简单应用
- 数据结构实验之串三:KMP应用
- SDUT 2772 数据结构实验之串一:KMP简单应用