数据结构实验之串三:KMP应用
来源:互联网 发布:tensorflow 编辑:程序博客网 时间:2024/06/02 19:40
Problem Description
有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?
Input
首先输入一个整数n,代表有n个小朋友。下一行输入n个数,分别代表每个小朋友手里糖的数量。
之后再输入一个整数m,代表下面有m个数。下一行输入这m个数。
Output
如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1
Example Input
5
1 2 3 4 5
3
2 3 4
Example Output
2 4
Think: 这是一道KMP算法的题, 这个算法代码比较简单,但是不好理解。这题除了要求对KMP算法的实现外(看题目要求),还要判断是否有唯一的一对L、R值。另外,这题数组的大小题目没说,所以就先开大一点,如果没AC,就再加几个0,哈哈O(∩_∩)O哈哈~
纯C代码如下:
#include <stdio.h>int s[1000100], s2[1000100];int next[1000100];void KMP(int s[], int s2[], int n, int m); //这是实现KMP算法的void getnext(int s2[], int m); //两个主要函数 int main(){ int n, m, i; scanf("%d", &n); for(i = 0; i < n; i++){ //我是从0开始存储的 scanf("%d", &s[i]); //被匹配的数组 } scanf("%d", &m); for(i = 0; i < m; i++){ scanf("%d", &s2[i]); } getnext(s2, m); //获得如果数组s2的某个位置匹配未成功,那么下一次可以从 KMP(s, s2, n, m); //哪个位置从新匹配标记位置的数组next[](这就是KMP,不 return 0; //从起始位置接着匹配,快速的原因)}void getnext(int s2[], int m) //可以在看代码时,举一个字符串跟随代码走一遍{ //比如abaabcac int i, j; //可能失配位置1234567 j = next[0] = -1; //新匹配位置01122312 i = 0; while(i <= m - 1){ if(j == -1||s2[i] == s2[j]){ //如果一个位置对应相同 i++; //两个数组的下标都要进行移动 j++; next[i] = j; } else j = next[j]; //从记忆里有匹配好的下一位置开始匹配 }}void KMP(int s[], int s2[], int n, int m) //开始匹配{ int i, j; i = j = 0; int num = 0; //用于保存完全匹配成功的次数(实际上当有两次时,直接退出) int k; //用于保存第一次匹配成功时数组s下标i的位置 while(i < n){ //删掉了&&j < m; if(j == -1||s[i] == s2[j]){ i++; j++; if(j == m){ //如果存在完全匹配成功 num++; //记录次数的变量+1 if(num == 1){ k = i; //存位置!!! } j = 0; //洗心革面,从新开始 i = i - m + 1; //S就不是从新开始~从上一次匹配的头的下一位置 if(num == 2) //有两次完全匹配成功的话就直接退出 break; //因为已经不OK啦::>_<:: } } else j = next[j]; } if(num == 1){ //如果仅有一组,则OK~ printf("%d %d\n", k - m + 1, k); } else printf("-1\n"); //0、2及以上次完全匹配成功}
阅读全文
1 0
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- NYOJ 19 擅长排列的小明
- tkinter中可变的变量
- POJ-2155:Matrix(二维线段树或二维树状数组)
- 1022
- 剑指Offer_面试题22_栈的压入弹出序列
- 数据结构实验之串三:KMP应用
- SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation 视频语义分割demo跑通
- 欢迎使用CSDN-markdown编辑器
- 使用Webview显示html文本遇到的字符实体问题
- 框架整合____Spring整合Struts2(主流整合方式,最精简整合方式)
- FloVIZ 11.0 build 15.25.5 1CD
- Linux SMB服务器配置(samba)
- 理解GBDT算法(三)——基于梯度的版本
- 海量数据处理(一):求前10000大的数字