洛谷P3808 【模板】AC 自動機(簡單版)題解 AC自動機模板題

題目鏈接:https://www.luogu.com.cn/problem/P3808

AC自動機模板題。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;

struct Node {
    int son[26], fail, id;
    Node() {}
    Node(int _id) {
        memset(son, 0, sizeof(son));
        fail = 0;
        id = _id;
    }
} tr[maxn];
int n, cnt, cc[maxn];
char s[maxn];

void ins(char *s, int id) {
    int u = 0;
    for (; *s; s++) {
        int c = (*s) - 'a';
        if (!tr[u].son[c])
            tr[ tr[u].son[c] = ++cnt ] = Node(0);
        u = tr[u].son[c];
    }
    tr[u].id = id;
    cc[u]++;
}

void build() {
    queue<int> que;
    for (int i = 0; i < 26; i++)
        if (tr[0].son[i])
            que.push(tr[0].son[i]);
    while (!que.empty()) {
        int u = que.front();
        que.pop();
        for (int i = 0; i < 26; i++) {
            int v = tr[u].son[i];
            if (!v) continue;
            int x = tr[u].fail;
            while (x && !tr[x].son[i])
                x = tr[x].fail;
            tr[v].fail = tr[x].son[i];
            que.push(v);
        }
    }
}

bool vis[maxn];
int cal(char *s) {
    int u = 0, cnt = 0;
    for (; *s; s++) {
        int c = (*s) - 'a';
        while (u && !tr[u].son[c])
            u = tr[u].fail;
        if (tr[u].son[c])
            u = tr[u].son[c];
        if (tr[u].id && !vis[tr[u].id]) {
            vis[tr[u].id] = true;
            cnt += cc[u];
        }
    }
    return cnt;
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%s", s);
        ins(s, i);
    }
    build();
    scanf("%s", s);
    printf("%d\n", cal(s));
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章