Cod sursa(job #2985516)

Utilizator Tudor_MateiHolota Tudor Matei Tudor_Matei Data 26 februarie 2023 16:15:23
Problema Aho-Corasick Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 5, M = 105;
int trie[N][26], fail[N], len[M], cnt[N], ans[M];
int n, idx = 0;
char A[N], s[M][M];

void insertTrie(int id) {
    int cur = 0;
    for (int i = 0; i < len[id]; ++i) {
        int c = s[id][i] - 'a';
        if (!trie[cur][c]) trie[cur][c] = ++idx;
        cur = trie[cur][c];
    }
    cnt[cur] = id;
}

void buildFail() {
    queue<int> q;
    for (int c = 0; c < 26; ++c) {
        int u = trie[0][c];
        if (u) q.push(u);
    }
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int c = 0; c < 26; ++c) {
            int v = trie[u][c], f = fail[u];
            if (!v) {
                trie[u][c] = trie[f][c];
                continue;
            }
            fail[v] = trie[f][c];
            q.push(v);
        }
    }
}

void match() {
    int cur = 0;
    for (int i = 0; A[i]; ++i) {
        int c = A[i] - 'a';
        cur = trie[cur][c];
        for (int j = cur; j; j = fail[j]) {
            if (cnt[j]) ++ans[cnt[j]];
        }
    }
}

int main() {
    ifstream cin("ahocorasick.in");
    ofstream cout("ahocorasick.out");
    cin >> A >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> s[i];
        len[i] = strlen(s[i]);
        insertTrie(i);
    }
    buildFail();
    match();
    for (int i = 1; i <= n; ++i) {
        cout << ans[i] << '\n';
    }
    return 0;
}