Cod sursa(job #3338456)

Utilizator rares89_Dumitriu Rares rares89_ Data 3 februarie 2026 14:50:34
Problema Aho-Corasick Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");

const int NMAX = 1000005;
int tr[NMAX][26], fail[NMAX], cnt[NMAX];
int q_bfs[NMAX], pos[105];
int nodes = 0;

string A, word;
int n;

void insert(const string &s, int idx) {
    int u = 0;
    for (char c : s) {
        int v = c - 'a';
        if (!tr[u][v]) tr[u][v] = ++nodes;
        u = tr[u][v];
    }
    pos[idx] = u;
}

void build_ac() {
    int head = 0, tail = 0;
    for (int i = 0; i < 26; ++i) {
        if (tr[0][i]) q_bfs[tail++] = tr[0][i];
    }

    while (head < tail) {
        int u = q_bfs[head++];
        for (int i = 0; i < 26; ++i) {
            if (tr[u][i]) {
                fail[tr[u][i]] = tr[fail[u]][i];
                q_bfs[tail++] = tr[u][i];
            } else {
                tr[u][i] = tr[fail[u]][i];
            }
        }
    }
}

int main() {
    fin >> A >> n;
    for (int i = 1; i <= n; ++i) {
        fin >> word;
        insert(word, i);
    }

    build_ac();

    int u = 0;
    for (char c : A) {
        u = tr[u][c - 'a'];
        cnt[u]++;
    }

    for (int i = nodes - 1; i >= 0; --i) {
        int u = q_bfs[i];
        cnt[fail[u]] += cnt[u];
    }

    for (int i = 1; i <= n; ++i) {
        fout << cnt[pos[i]] << '\n';
    }

    return 0;
}