AC自动机三道模板题
虽然是模板题,但是写出来的全是WA自动机
P3808 【模板】AC 自动机(简单版)
这道题是AC自动机的模板题,只需要老老实实建立fail指针,建fail时顺带建边优化fail即可。
题目要求,求文本串中出现了几个模式串,只需要记录end,然后跳fail就行(为什么要跳fail可以画个图,顺便再把fail独立出来)。
只要在用的时候不要忘了调用建fail就行。
下面是一个模板。
struct ACAM {
int child[MAXN][SIZE], tot, end[MAXN], fail[MAXN];
void insert(const string &s) {
int now = 0;
for (auto x : s) {
int cl = x - 'a';
if (!child[now][cl])
child[now][cl] = ++ tot;
now = child[now][cl];
}
end[now] ++;
}
void build() {
queue<int>q;
for (int i = 0; i < SIZE; ++ i)
if (child[0][i]) // 本来这里要连边的,不过已经完成了
q.push(child[0][i]);
while (!q.empty()) {
int now = q.front();
q.pop();
for (int i = 0; i < SIZE; ++ i) {
if (child[now][i]) // 建fail
fail[child[now][i]] = child[fail[now]][i], q.pushi(child[now][i]);
else // 连边优化
child[now][i] = child