AC自动机学习笔记(简略)

CSP-S T3 竟然考AC自动机!

CPP 居然没教过,太坏了

要建AC自动机,首先需要建一个 trie 树

然后核心就是在于 build,我们用 bfs 去跑

由于需要多次进行匹配,我们找到一个border最长的,显然一个的border是父亲的对应的儿子过去

反正最后挺好弄的

代码:

void build(){
    queue<int> q;
    for(int i=0;i<26;i++)if(son[0][i])q.push(son[0][i]);
    while(!q.empty()){
        int p=q.front();
        q.pop();
        for(int i=0;i<26;i++){
            if(son[p][i]){
                fail[son[p][i]]=son[fail[p]][i];
                d[fail[son[p][i]]]++;
                q.push(son[p][i]);
            }
            else son[p][i]=son[fail[p]][i];
        }
    }
}

如果题目要求包含某个串,并且标记打到了点上,那么就在每个点fail指针处传下来

如果要求在某个串之内的点,那么就用拓扑排序,以fail为路径传递

关于上面的 dp 则通常是枚举上面的一个点,然后枚举其儿子,进行转移

posted @ 2025-11-28 09:23  huhangqi  阅读(0)  评论(0)    收藏  举报
/*
*/