Алгоритм Ахо-Корасик: различия между версиями

Материал из Олимпиадное программирование в УлГТУ
Перейти к навигации Перейти к поиску
(Новая страница: « class Trie { struct Vertex { bool isTerminal = false; map<char, Vertex> next; Vertex *sufLink = nullptr; map<char, Verte...»)
 
Нет описания правки
Строка 29: Строка 29:
             }
             }
   
   
             for (char c = ' '; c < ' ' + alphabetSize; c++) {
             for (char c = 'a'; c < 'a' + alphabetSize; c++) {
                 if (v->next.count(c))
                 if (v->next.count(c))
                     v->autLink[c] = &v->next[c];
                     v->autLink[c] = &v->next[c];

Версия от 00:24, 18 сентября 2020

class Trie {
    struct Vertex {
        bool isTerminal = false;
        map<char, Vertex> next;
        Vertex *sufLink = nullptr;
        map<char, Vertex *> autLink;
    } root;

public:
    void add(const string &s) {
        Vertex *v = &root;
        for (const char &c : s)
            v = &v->next[c];
        v->isTerminal = true;
    }

    void build(int alphabetSize) {
        queue<Vertex *> q;
        root.sufLink = &root;
        q.push(&root);

        while (!q.empty()) {
            Vertex *v = q.front();
            q.pop();

            for (auto &[c, to] : v->next) {
                to.sufLink = (v == &root ? &root : v->sufLink->autLink[c]);                
                q.push(&to);
            }

            for (char c = 'a'; c < 'a' + alphabetSize; c++) {
                if (v->next.count(c))
                    v->autLink[c] = &v->next[c];
                else
                    v->autLink[c] = (v == &root ? &root : v->sufLink->autLink[c]);
            }

            v->isTerminal |= v->sufLink->isTerminal;
        }
    }

    bool check(const string &s) {
        Vertex *v = &root;
        for (const char &c : s) {
            v = v->autLink[c];
            if (v->isTerminal)
                return true;
        }
        return false;
    }
};

Ссылки

Теория:

Код: