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

来源:互联网 发布:邓肯巅峰数据 编辑:程序博客网 时间:2024/06/05 13:14

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

Input

首先输入一个整数n,代表有n个小朋友。下一行输入n个数,分别代表每个小朋友手里糖的数量。

之后再输入一个整数m,代表下面有m个数。下一行输入这m个数。

Output

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

Example Input

51 2 3 4 532 3 4

Example Output

2 4


此题有坑! “唯一”!!!

#include <iostream>#include <cstdio>#include <cstring>//using namespace std; 加上这句话,next就会产生歧义...与这里的命名空间有关系,具体我也不懂const int N = 1e6 + 3;int t[N], p[N], next[N];int n, m, r, cnt = 0;void GetNext(){    next[0] = -1;    int j = -1;    for(int i = 1; i < m; i++)    {        while(j != -1 && p[i] != p[j + 1])            j = next[j];        if(p[i] == p[j + 1]) j++;        next[i] = j;    }}void KMP(){    GetNext();    int j = -1;    for(int i = 0; i < n; i++)    {        while(j != -1 && t[i] != p[j + 1])            j = next[j];        if(t[i] == p[j + 1]) j++;        if(j == m - 1)    //匹配成功后,记录次数,j回退,继续匹配直至匹配完整text        {            r = i;            cnt++;            j = next[j];        }     }}int main(){    scanf("%d", &n);    for(int i = 0; i < n; i++)        scanf("%d", &t[i]);    scanf("%d", &m);    for(int i = 0; i < m; i++)        scanf("%d", &p[i]);    KMP();    if(cnt == 1) //唯一一对        printf("%d %d", r - m + 2, r + 1);    else        printf("-1");    return 0;}


原创粉丝点击