SDUT_3311_数据结构实验之串三:KMP应用
2017-09-28 18:15
267 查看
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
51 2 3 4 5
3
2 3 4
Example Output
2 4题意:
找出子串在目标串中的位置,如果在目标串中有多个子串输出-1;
只有一个时,才输出所在的位置。
分析:
KMP算法代码是找到在目标串中有子串就返回其位置,不会继续往下找,所以要想继续往下找,就要自己写喽。
代码
#include <iostream> #include <cstdio> using namespace std; int n,m; int a[100000005],b[100000005]; int book[100000005]; void get_next(int m,int b[]) { int i=0; int j=-1; book[0] = -1; while(i < m) { if(j == -1||b[i] == b[j]) { i++; j++; if(b[ 4000 i] != b[j]) book[i] = j; else book[i] = book[j]; } else j = book[j]; } } void KMP(int a[],int b[]) { int i=0; int j=0; int cnt=0; int pos; while(i < n && j < m) { if(j == -1||a[i] == b[j]) { i++; j++; //一般的模板代码是找到有子串就返回位置,不会在继续往后找了 //所以要想继续往后走,就要加这一步 if(j == m) { cnt++; //找目标串中有几个子串,大于一个,输出-1否则输出所在位置 pos = i; //当前位置(子串最后一个元素所在的位置) j = book[j]; //找到一个之后继续往后找。 if(cnt > 1) //多于一个子串就结束循环。 break; } } else j = book[j]; } if(cnt == 1) printf("%d %d",pos-m+1,pos); else printf("-1\n"); } int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&m); for(int j=0;j<m;j++) scanf("%d",&b[j]); get_next(m,b); KMP(a,b); return 0; }
相关文章推荐
- 数据结构实验之串三:KMP应用 sdut(oj 3311)
- SDUT 3311 数据结构实验之串三:KMP应用
- [SDUT](3311)数据结构实验之串三:KMP应用 ---KMP(串)
- sdut 3311 数据结构实验之串三:KMP应用
- 3311 数据结构实验之串三:KMP应用
- SDUT 2272 数据结构实验之串一:KMP简单应用
- SDUT 2772 数据结构实验之串一:KMP简单应用
- [SDUT](2772)数据结构实验之串一:KMP简单应用 ---KMP(串)
- <sdut-ACM>数据结构实验之串三:KMP应用
- SDUT 2772 数据结构实验之串一:KMP简单应用
- SDUTOJ(3311)数据结构实验之串三:KMP应用
- 3311-数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用
- 2772. 数据结构实验之串一:KMP简单应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串一:KMP简单应用
- SDUTACM 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用