怀旧书本
#include <bits/stdc++.h>
using namespace std;

void build(string s, int next[]) {
    next[0] = 0;
    for (int i = 1, j = 0; i < s.size(); ++i) {
        while (j > 0 && s[i] != s[j]) j = next[j - 1];
        if (s[i] == s[j]) ++j;
        next[i] = j;
    }
}

vector<int> match(string& s, string& p, int next[]) {
    vector<int> ans;
    for (int i = 0, j = 0; i < s.size(); ++i) {
        while (j > 0 && s[i] != p[j]) j = next[j - 1];
        if (p[j] == s[i]) ++j;
        if (j == p.size()) {
            ans.push_back(i - p.size() + 1);
            j = next[j - 1];
        }
    }
    return ans;
}

int main() {
    int n, m;
    string p, s;
    cin >> n >> p >> m >> s;
    int next[n];
    build(p, next);
    vector<int> ma = match(s, p, next);
    for (auto c : ma) cout << c << " ";
    return 0;
}
本文为原创文章,欢迎分享,勿全文转载,如果内容你实在喜欢,可以加入收藏夹,说不定哪天故事又继续更新了呢。
本文地址:https://qoogle.top/kmp/
最后修改日期:2020年4月29日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。