Cod sursa(job #3306676)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 12 august 2025 17:59:56
Problema Aho-Corasick Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.3 kb
#include <bits/stdc++.h>

using namespace std;

struct TrieNode {
    TrieNode* ch[26];
    TrieNode* failure;
    TrieNode* parent;
    int lastch;
    int dp;
    TrieNode() {
        lastch = -1;
        dp = 0;
        for (int i = 0; i < 26; i++) {
            ch[i] = nullptr;
        }
        failure = parent = nullptr;
    }
} *root;

string v[105];

void add(string a) {
    TrieNode* curr = root;
    for (auto c : a) {
        if (curr->ch[c - 'a'] == nullptr) {
            curr->ch[c - 'a'] = new TrieNode();
            curr->ch[c - 'a']->parent = curr;
            curr->ch[c - 'a']->lastch = (int) (c - 'a');
        }
        curr = curr->ch[c - 'a'];
    }
}

stack<TrieNode*> st; //inverse order of bfs

void bfs() {
    queue<TrieNode*> q;
    q.push(root);
    while (!q.empty()) {
        TrieNode* curr = q.front();
        st.push(curr);
        q.pop();
        if (curr == root) {
            curr->failure = root;
        }
        else if (curr->parent == root) {
            curr->failure = root;
        }
        else {
            TrieNode* curr2 = curr->parent->failure;
            char want = curr->lastch;
            while (curr2 != root && curr2->ch[want] == nullptr) {
                curr2 = curr2->parent->failure;
            }
            if (curr2->ch[want] != nullptr)
                curr2 = curr2->ch[want];
            curr->failure = curr2;
        }
        for (int i = 0; i < 26; i++) {
            if (curr->ch[i] != nullptr)
                q.push(curr->ch[i]);
        }
    }
}

void solve(string s) {
    TrieNode* curr = root;
    for (auto c : s) {
        while (curr != root && curr->ch[c - 'a'] == nullptr) {
            curr = curr->failure;
        }
        if (curr->ch[c - 'a'] != nullptr)
            curr = curr->ch[c - 'a'];
        curr->dp = (curr->dp) + 1;
    }
    while (!st.empty()) {
        curr = st.top();
        st.pop();
        curr->failure->dp += curr->dp;
    }
}

int main() {

    root = new TrieNode();
    string s;
    cin >> s;
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> v[i];
        add(v[i]);
    }
    bfs();
    solve(s);
    for (int i = 1; i <= n; i++) {
        TrieNode* curr = root;
        for (auto c : v[i]) {
            curr = curr->ch[c - 'a'];
        }
        cout << curr->dp << '\n';
    }
    return 0;
}