PTA 匹配圆周率

1,344 阅读2分钟

使用KMP算法实现串匹配你在课堂上想必已经烂熟于心了,不过咱们先来聊一聊圆周率π。有的人猜想,无理数π的小数部分包含了宇宙中的大秘密,比如你的生日、你男朋友/女朋友的生日,甚至是你的银行卡的账号密码。将它穷尽是一件不可能的事情,但是我们可以对前面的部分进行考察。 在这个题目中,不允许使用编程语言内置的字符串匹配算法,例如C语言中的strcmp。

如果你想查找自己的π信息,可以登录网站The Pi-Search Page

输入格式:

输入为两行,第一行为圆周率小数部分的节选s,长度不超过106;第二行是要查找的数字串t,长度不超过106。可以假设,输入都是0~9这样的数字。

输出格式:

输出t在s中首次出现的位置。如果t未在s中出现,则输出-1,以换行结尾。

输入样例1:

821999052039574422
19990520
结尾无空行

输出样例1:

2
结尾无空行

输入样例2:

881994082555083527588321827035
19940825
结尾无空行

输出样例2:

2
结尾无空行

输入样例3:

141592653
264
结尾无空行

输出样例3:

-1
结尾无空行

代码:

# include <iostream>
# include <vector>
using namespace std;

vector<int> get_next(string b)
{
    vector<int> result;
    int i, j ,l;
    i = 0;
    j = -1;
    l = b.size();
    result.push_back(-1);
    while (i < l - 1)
    {
        if (j == -1 || b[i] == b[j])
        {
            ++i;
            ++j;
            if (b[i] != b[j])
                result.push_back(j);
            else if (i == 1)
                result.push_back(j);
            else
                result.push_back(result[j]);
        }
        else
            j = result[j];
    }
    return result;
}

int KMP(string a, string b)
{
    vector<int> next;
    next = get_next(b);
    int i ,j,l1,l2;
    i = j = 0;
    l1 = a.size();
    l2 = b.size();
    while (i < l1 && j < l2)
    {
        if (j == -1 || a[i] == b[j])
        {
            ++i;
            ++j;
        }
        else
        {
            j = next[j];
        }
    }
    if (j == l2)
    {
        return i - j;
    }
    else
    {
        return -1;
    }
}

int main()
{
    string s,p;
    int t;
    cin >> s >> p;
    t = KMP(s, p);
    cout << t << endl;
}

提交结果:

6.png