数据结构实验之串三:KMP应用
2016-10-29 21:39
141 查看
数据结构实验之串三:KMP应用
Time Limit: 1000MSMemory Limit: 65536KB
[align=center][/align]
Problem Description
有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?Input
首先输入一个整数n,代表有n个小朋友。下一行输入n个数,分别代表每个小朋友手里糖的数量。之后再输入一个整数m,代表下面有m个数。下一行输入这m个数。
Output
如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1Example Input
5 1 2 3 4 5 3 2 3 4
Example Output
//数组开到10^8才能过2 4
#include<stdio.h> #include<string.h> int n,m; int next[100000100]; int s[100000100]; int p[100000100]; void get_next(int *p) { int i=0,j=-1; next[0]=-1; while(i<m-1) { if(j==-1||p[i]==p[j]) { next[++i]=++j; } else j=next[j]; } } int kmp(int *s,int *p) { int i=0,j=0; memset(next,0,sizeof(next)); get_next(p); while(i<n&&j<m) { if(j==-1||s[i]==p[j]) { i++;j++; } else j=next[j]; } if(j>=m) { return i-m+1; } else return -1; } int main() { while(~scanf("%d",&n)) { int i; for(i=0;i<n;i++) { scanf("%d",&s[i]); } scanf("%d",&m); for(i=0;i<m;i++) { scanf("%d",&p[i]); } int k=kmp(s,p); if(k!=-1) { int kk=kmp(s+k,p); if(kk==-1) printf("%d %d\n",k,k+m-1); else printf("-1\n"); } else printf("-1\n"); } return 0; }
相关文章推荐
- SDUT数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- SDUT 3311 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构上机实验之二分查找
- 数据结构实验之二叉树五:层序遍历 oj
- 数据结构实验之二叉树三:统计叶子数
- SDUT 3361-数据结构实验之图论四:迷宫探索(dfs)
- 数据结构实验之链表七:单链表中重复元素的删除
- 数据结构实验之链表九:双向链表
- 3344-->数据结构实验之二叉树五:层序遍历
- 数据结构实验之查找五:平方之哈希表
- SDUT-数据结构实验之排序五:归并求逆序数
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- 数据结构实验2-2:单链表及其相关操作
- SDUT 2116 数据结构实验之链表一:顺序建立链表
- 数据结构实验之数组二:稀疏矩阵