Cod sursa(job #3357369)

Utilizator VladPislaruPislaru Vlad Rares VladPislaru Data 9 iunie 2026 09:37:51
Problema Aho-Corasick Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;

const int ALPHABET_SIZE = 26;

struct TrieNode {
    struct TrieNode *children[ALPHABET_SIZE];
    bool isLeaf;
    vector<int> index;
};

TrieNode *getNode() {
    TrieNode *node = new TrieNode;
    node->isLeaf = false;
    for (int i = 0; i < ALPHABET_SIZE; i++)
        node->children[i] = NULL;
    return node;
}

void insert(TrieNode *root, string key, int index) {
    TrieNode *pCrawl = root;
    for (int i = 0; i < key.length(); i++) {
        int idx = key[i] - 'a';
        if (!pCrawl->children[idx])
            pCrawl->children[idx] = getNode();
        pCrawl = pCrawl->children[idx];
        pCrawl->index.push_back(i);
    }
    pCrawl->isLeaf = true;
}

void searchWord(TrieNode *root, string key) {
    TrieNode *pCrawl = root;
    for (int i = 0; i < key.length(); i++) {
        int idx = key[i] - 'a';
        if (!pCrawl->children[idx])
            return;
        pCrawl = pCrawl->children[idx];
    }
    for (int i = 0; i < pCrawl->index.size(); i++) {
        cout << pCrawl->index[i] << " ";
    }
}

int main() {
    ifstream in("ahocorasick.in");
    ofstream out("ahocorasick.out");
    
    string text;
    int n;
    in >> text >> n;
    
    TrieNode *root = getNode();
    
    for (int i = 0; i < n; i++) {
        string key;
        in >> key;
        insert(root, key, i);
    }
    
    for (int i = 0; i < text.length(); i++) {
        searchWord(root, text.substr(i));
    }
    
    return 0;
}