欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-02 17:04:57
...

Description

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

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

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

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

5

1 2 3 4 5

3

2 3 4

Output

2 4

#include<bits/stdc++.h>

using namespace std;
#define maxn 1000010
int s[maxn], p[maxn], Next[maxn], n, m;
void get_next()
{
    int j = -1, k = 0;
    Next[0] = -1;
    while(k < m)
    {
        if(j == -1 || p[j] == p[k])
        {
            j++;
            k++;
            Next[k] = j;
        }
        else j = Next[j];
    }
}
int kmp(int beg)
{
    int i = beg, j = 0;
    while(i < n && j < m)
    {
        if(j == -1 || s[i] == p[j])
        {
            i++;
            j++;
        }
        else j = Next[j];
    }
    if(j == m)
        return i - j + 1;
    else
        return -1;
}

int main()
{
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> s[i];
    cin >> m;
    for(int i = 0; i < m; i++)
        cin >> p[i];
    get_next();
    int x = kmp(0);
    if(x == -1)
        cout << "-1" << endl;
    else
    {
        if(kmp(x) == -1) cout << x << ' ' << x + m - 1 << endl;
        else cout << "-1" << endl;
    }
    return 0;
}