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