Структуры данных
- Запрос на прямоугольнике.
- 2D дерево отрезков от N точек с NlogN памятью (дерево отрезков, в каждой вершине еще одно дерево отрезков)
- Вертикальный путь в дереве = прямоугольник на плоскости [все запросы в меняющемся дереве за O(log2N)]
- Heavy-Light decomposition дерева (покрытие путями, для каждого пути хранится дерево отрезков) [все запросы в меняющемся дереве за O(log2N)]
Задачи на пройденные структуры данных
- Persistent СНМ
Классика
- Z-функция
- Префикс-функция
- Решение задач Z и Prefix функциями
- Поиск подстроки в тексте
- Период строки
- Наименьший номер строки массиве ее циклических сдвигов
- Количество подстрок, входящих в текст 2 раза.
Алгоритм Ахо-Корасик
- Задача: найти подстроку из словаря в тексте за O(|Text|)
- Складываем строки в несжатый бор
- Определяем suf-ссылку
- Строим полный автомат
Строки. Хэши.
- Полиномиальный хэш. Hash(s) - псевдослучайное число в диапозоне от 0 до 264 - 1.
- Коллизии, обработка коллизий, вероятность возникновения коллизий.
- Сравнение строк на равенство за O(1).
- Полиномиальный хэш применим к произвольному объекту. Пример: отсечение в переборе с помощью set <long long>.
- Решение задач хэшами и хэш-таблицами
- Наибольшая общая подстрока.
- Поиск словарных слов в тексте.
- Количество подстрок строки.
Строки. Суффиксный массив.
- Определение. Построение в лоб за O(N2logN). Реальное время работы уже O(NlogN).
- Сравнение строк на больше и меньше за O(logN) хэшами.
- Построение суффиксного массива за O(Nlog2N) в худшем случае.
- Построение LCP для суффиксного массива за O(NlogN).
- Решение задачи поиска подстроки в тексте с помощью суф. массива за предподсчет O(|Text|*log2) и запрос за O(|S|*log|Text|).
LCP
- Предподсчет LCP[i,j] динамикой за O(N2)
- LCP[i,j] = минимум на отрезке, если построить суф. массив
- LCP[i,j] считается за O(logN) хэшами
Суф. дерево
- Опередление.
- Сжатое суф. дерево.
- Алгоритм построения за O(N2).
- Решение задач суф.деревом
- Количество подстрок
- Количество общихподстрок
- Количество подпалиндромов