Строки: суффиксное дерево (26 октября 2017)
- Бор
- Способы хранения. Array, list, treeSet, hashSet, splaySet.
- Сортировка бором
- Алгоритм Ахо-Корасик
- Постановка задачи, решение бором в лоб за O(|text|*max|si|)
- Определение суфф ссылок.
- Вычисление суфф ссылок и связь с префикс-функцией. Порядок вычисления: bfs. Фиктивная вершина.
- Доказательство времени работы O(∑leni).
- Полный автомат: вычисление next[v,char], использование для получения суфф ссылок за O(1).
- Применение к поиску строки в тексте. Добавляем isEnd[v], доказываем, что всегда найдём строку.
− Перерыв −
- Суфф дерево
- Сжатый бор. Хранение. Информацию про ребро можно хранить от вершины, куда ведёт ребро.
- Суфф дерево за [T=O(n2), M=O(n)]
- Задача "поиск подстроки в тексте" за O(|s|) суфф деревом.
- Суфф массив ↔ суфф дерево
- Суфф массив + LCP → суфф дерево. O(n).
- Cуфф дерево → Суфф массив + LCP. O(n).
- Алгоритм Укконена построения суфф дерева в online
- Простая версия за [T=O(n2), M=O(n)]: храним указатели на концы суффиксов
- Суффиксы-листья растут сами
- Жизненный цикл суффикса (1) идёт по дереву, (2) разветвился, (3) саморастущий лист.
- Основная лемма: если суффикс не разветвился, то все более короткие тоже не разветвились.
- Алгоритм: храним указатель на самый длинный не разветвившийся, пересчитываем его.
- Подсчёт суфф ссылки. Линейность времени работы.
- Тонкости реализации
- Фиктивная вершина помогает два раза: всегда есть суфф ссылка, всегда будет (1)-суффикс
- При создании новой суфф ссылки, может оказаться, вершина ещё не создана... но мы уже знаем её номер (наша нумерация − автоинкремент).
- После перехода по суфф ссылке идти вниз нужно, пока не дойдём до вершины, до которой "чуть-чуть не достаём".