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