KMP

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

void solve() {
    string s, p; cin >> s >> p;
    s = " " + s; p = " " + p;  // 转为1-based下标
    int n = s.size() - 1, m = p.size() - 1;
    
    // next[i]: 前缀p[1..i]的最长border长度
    vector<int> next(m + 1); next[1] = 0;
    
    // 计算next数组 O(m)
    for (int i = 2, j = 0; i <= m; i++) {
        while (j > 0 && p[i] != p[j + 1]) j = next[j];
        if (p[i] == p[j + 1]) j++;
        next[i] = j;
    }
    
    // 匹配过程 O(n)
    for (int i = 1, j = 0; i <= n; i++) {
        while (j > 0 && s[i] != p[j + 1]) j = next[j];
        if (s[i] == p[j + 1]) j++;
        if (j == m) {
            cout << i - m + 1 << endl;  // 输出匹配位置(1-based)
            // j = next[j];  // 继续匹配后续可能位置
        }
    }
    
    // 输出前缀的最长border长度
    for (int i = 1; i <= m; i++) cout << next[i] << " ";
    cout << endl;
}
posted @ 2025-07-02 16:25  Qacter  阅读(4)  评论(0)    收藏  举报