R7-4 匹配圆周率

Author Avatar
小包
发表:2024-11-03 04:28:14
修改:2024-11-03 04:28:14

使用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>
#include <string>

using namespace std;

vector<int> computeLPS(const string& pattern) {
    int m = pattern.length();
    vector<int> lps(m, 0);
    int len = 0;
    int i = 1;

    while (i < m) {
        if (pattern[i] == pattern[len]) {
            len++;
            lps[i] = len;
            i++;
        } else {
            if (len != 0) {
                len = lps[len - 1];
            } else {
                lps[i] = 0;
                i++;
            }
        }
    }
    return lps;
}

int KMPSearch(const string& text, const string& pattern) {
    int n = text.length();
    int m = pattern.length();
    vector<int> lps = computeLPS(pattern);

    int i = 0, j = 0;
    while (i < n) {
        if (pattern[j] == text[i]) {
            i++;
            j++;
        }

        if (j == m) {
            return i - j;  // Pattern found
        } else if (i < n && pattern[j] != text[i]) {
            if (j != 0) {
                j = lps[j - 1];
            } else {
                i++;
            }
        }
    }
    return -1;  // Pattern not found
}

int main() {
    string text, pattern;
    getline(cin, text);
    getline(cin, pattern);

    int result = KMPSearch(text, pattern);
    cout << result << endl;

    return 0;
}

评论