Алгоритм Ахо-Корасик: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) Нет описания правки |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
class Trie { | |||
struct Vertex { | struct Vertex { | ||
bool isTerminal = false; | bool isTerminal = false; | ||
Строка 49: | Строка 49: | ||
return false; | return false; | ||
} | } | ||
}; | }; | ||
== Ссылки == | == Ссылки == |
Версия от 20:56, 24 сентября 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; } };
Ссылки
Теория:
- e-maxx.ru — Алгоритм Ахо-Корасик
- neerc.ifmo.ru/wiki — Алгоритм Ахо-Корасик
- Codeforces — Алгоритм Ахо-Корасик. Построение
- Algorithmica — Алгоритм Ахо-Корасик: 1, 2
Код: