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 则通常是枚举上面的一个点,然后枚举其儿子,进行转移

浙公网安备 33010602011771号