数据结构实验之串三:KMP应用
2016-08-04 21:12
190 查看
数据结构实验之串三: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
提示
这个题目需要注意的是数组开的大小,小了会WA,还有主要结果的输出,最4000
好等主串遍历完成了再输出!
#include<stdio.h> #include<string.h> #include<stdlib.h> int p[1100000]; int t[1100000]; int next[1100000];//切记,!!!数组大小必须这么大,否则Wrong Aswer int n,m; void getnext(int p[]) { int i,j; i=0;j=-1;next[0]=-1; while(i<m) { if(j==-1||p[i]==p[j]) { i++; j++; if(p[i]!=p[j]) { next[i]=j; } else { next[i]=next[j]; } } else { j=next[j]; } } } int kmp(int t[],int p[]) { int i=0; int j=0; int count=0; int num; while(i<n) { if(j==-1||t[i]==p[j]) { i++; j++; } else { j=next[j]; } if(j==m) { count++; /*if(count>1) { printf("-1\n"); return 0; }*/ //else if(count==1) { num=i; } j=0; } } //最好是当主串比较完了再输出,避免错误情况 if(count==1) { printf("%d %d\n",num-m+1,num-m+1+m-1); } else { printf("-1\n"); } return 0; } int main() { while(~scanf("%d",&n))//多组或一组输入都可以 {for(int i=0;i<n;i++) { scanf("%d",&t[i]); } scanf("%d",&m); for(int i=0;i<m;i++) { scanf("%d",&p[i]); } getnext( p); kmp(t,p); } return 0; }
相关文章推荐
- SDUT数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- SDUT 3311 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验课程----实验二(利用链表实现学生健康系统)
- 哈工大数据结构实验3 图的应用
- 数据结构实验四:图的表示和实现
- 数据结构实验之图书馆借书线性表的顺序和链式存取结构的应用
- 数据结构实验2
- SDUT-2137 数据结构实验之求二叉树后序遍历和层次遍历
- 【并查集】数据结构与算法实验题 11.2 病毒排查问题
- 回顾大学--大二数据结构实验--实验三 链表
- 数据结构实验之分类二叉树的构建
- 数据结构实验之求二叉树后序遍历和层次遍历
- 数据结构图的综合实验代码
- SDUT-2137数据结构实验之求二叉树后序遍历和层次遍历
- 回顾大学--大二数据结构实验--实验一 递归练习