KMP

#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>

using namespace std;

const int MAXN = 1000010;
int m, n;
string s, p;
int nxt[MAXN];
int main()
{
    cin >> s >> p;
    m = s.size(), n = p.size();
    s = ' ' + s, p = ' ' + p;
    nxt[1] = 0;
    for (int i = 2, j = 0; i <= n; i++)
    { // 求next可以看作自己和自己匹配
        while (j && p[i] != p[j + 1])
            j = nxt[j]; // 匹配失败回跳
        if (p[i] == p[j + 1])
            j++; // 匹配成功,模式串指针后移
        nxt[i] = j;
    }
    for (int i = 1, j = 0; i <= m; i++)
    {
        while (j && s[i] != p[j + 1])
            j = nxt[j];
        if (s[i] == p[j + 1])
            j++;
        if (j == n) // 每次匹配完成
        {
            cout << i - n + 1 << endl;
            j = nxt[j];
        }
    }
    for (int i = 1; i <= n; i++)
        cout << nxt[i] << " ";
    return 0;
}

P3375 [模板]KMP

posted @ 2025-07-12 14:36  张诗羽  阅读(12)  评论(0)    收藏  举报