可持久化kmp

模板

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1000100;
int n, m, q, nex[N], pre[N], top;
char s[N], t[N];
inline void add (char x) {
    int j = top;
    while (j && s[nex[j] + 1] != x) j = pre[j];
    s[++ top] = x;
    j = nex[j] + 1;
    if (top == 1) nex[top] = pre[top] = 0;
    else if (s[j] == x) {
        nex[top] = j;
        if (s[nex[j] + 1] == s[j + 1]) pre[top] = pre[j];
        else pre[top] = j;
    } else nex[top] = pre[top] = 0;
}
int main () {
    scanf("%s", t + 1);
    n = strlen(t + 1);
    for (int i = 1; i <= n; i ++) add(t[i]);
    scanf("%d", &q);
    while (q --) {
        scanf("%s", t + n + 1);
        m = strlen(t + n + 1);
        top = n;
        for (int i = n + 1; i <= n + m; i ++) {
            add(t[i]);
            printf("%d ", nex[i]);
        }
        printf("\n");
    }
    return 0;
}
posted @   duoluoluo  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示