数据结构实验之串三:KMP应用

来源:互联网 发布:手机中通抢单软件 编辑:程序博客网 时间:2024/05/16 11:32

题目描述

有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?

输入

首先输入一个整数n,代表有n个小朋友。(0

输出

 如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1

示例输入

51 2 3 4 532 3 4

示例输出

2 4 
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int s1[1000010], s2[1000010];int next[1001000];void Next(int len)   //求模式串的next数组{next[0] = -1;int i = 0, j = -1;while (i < len){if (j == -1 || s2[i] == s2[j]){i++;j++;next[i] = j;}else{j = next[j];}}}int kmp(int len1, int len2, int x){Next(len2);int i = x, j = 0;while (i < len1 && j < len2){if (j == -1 || s1[i] == s2[j]){i++;j++;}else{j = next[j];}}//whileif (j == len2){return i - len2 + 1;}else{return -1;}}int main(){int n, m, i;while (~scanf("%d", &n)){for (i = 0; i < n; i++){scanf("%d", &s1[i]);}scanf("%d", &m);for (i = 0; i < m; i++){scanf("%d", &s2[i]);}int x = kmp(n, m, 0);if (x != -1){int k = kmp(n, m, x + m - 1);if (k == -1){printf("%d %d\n", x, x + m - 1);}else{printf("-1\n");}}else            printf("-1\n");}return 0;}


0 0
原创粉丝点击