数据结构实验之串三:KMP应用
2016-08-04 19:27
302 查看
题目描述
有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
提示
#include <iostream>#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define maxsize 10000010
int next[maxsize];
using namespace std;
void getnext(int b[], int m)
{
int i = 0, j = -1; //i 用来负责遍历整个字符串s2, j 用来存放此时的最大公共长度
next[0] = -1; //当next[0]的时候不指向任何的字符串s2中的元素,就像链表中的头结点
//它用来为不满足j == -1 || s2[i] == s2[j]情况下的j 赋值
while(i < m)
{
if(j == -1 || b[i] == b[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int kmp(int a[], int b[], int n, int m)
{
int i = 0, j = 0;
getnext(b, m); //调用getnext函数,来获取此时所谓的最大公共长度,也就是对应部分匹配值
//对应部分匹配值,所说就是一个字符串它的前缀和后缀中的共同元素
//当前位置的最大公共长度,就可以理解为第i个位置之前的字符串中前缀和后缀的公共长度
//例如:s2 : abcdabd a 的前缀后缀皆为0,无公共元素
//abcd前缀为a, ab, abc 后缀为 bcd, cd, d,前缀和后缀亦无公共元素,最大公共长度亦为0
//而当abcdab的时候,前缀为a, ab, abc, abcd, abcda 后缀为 bcdab, cdab, dab, ab, a 最大公共元素为2
while(i < n && j < m) //每个字符串都从第一个字符开始,直到任一字符串结束不再循环
{
if(j == -1 || a[i] == b[j])
{
i++;
j++;
}
else
j = next[j];
}
if(j >= m)
return i - m + 1;
else
return -1;
}
int main()
{
int n, m;
int a[maxsize], b[maxsize];
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
cin >> m;
for(int i = 0; i < m; i++)
cin >> b[i];
int x = kmp(a, b, n, m);
if(x != -1)
{
int y = kmp(a + x, b, n, m);
if(y == -1)
cout << x << " " << x + m - 1 << endl;
else
cout << "-1" << endl;
}
else
cout << "-1" << endl;
return 0;
}
相关文章推荐
- 数据结构实验之串一:KMP简单应用
- sdut 3311 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用 sdut(oj 3311)
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用
- SDUT 2272 数据结构实验之串一:KMP简单应用
- 暑假集训 8.5 KMP 数据结构实验之串一:KMP简单应用sdutoj2772
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串一:KMP简单应用
- SDUTACM 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- SDUTACM 数据结构实验之串一:KMP简单应用
- 数据结构实验之串三:KMP应用
- SDUT 2772 数据结构实验之串一:KMP简单应用