Алгоритмы на строках (СПБГУ МатМех, март 2013, спецкурс 344-й группы)
- Общие факты
- Сортировка строк стандартной функцией sort работает за O(SumLen * log)
- Решение задач на тему прошлой лекции
- Нахождение min циклического сдвига строки за O(n)
- Количество подпалиндромов строки за O(nlogn)
- Самый длинный подпалиндром за O(nlogn) и O(n)
- Поиск подстроки в строке и подматрицы в матрице хэшами
- Хэши
- Наибольшая общая подстрока хэшами с бинпоиском за O(nlogn)
- Сравнение строк на больше-меньше за O(logn)
- Сортировка циклических сдвигов за O(nlog2n)
- Сортировка суффиксов
- Нахождение периода строки и периода матрицы хэшами
- Построение LCP любых двух строк за O(logn) хэшами
- Построение LCP всех пар за O(n2)
- Количество подстрок строки суффиксным массивом с LCP за O(n)
- Наибольшая общая подстрока суффиксным массивом за O(n)
- Бор и сжатый бор
- Алгоритм поиска словарного слова в тексте за O(|text|*max|word|)
- Хранение бора: массив, список, set, hash-таблица, полу-массив.
- Суффиксное дерево. Построение за квадрат.
- Использование суффиксного дерева: поиск строки в тексте за O(|s|) (строим суф.дерево от текста)
- Сжатый бор. Суффиксное дерево теперь использует O(n) памяти, строится за O(n2).
- Построение суф.дерева по суф.массиву с LCP за O(n).
- Суффиксный массив за O(nlogn)
- Общая идея: удвоение отсортированных частей
- Храним две вещи: порядок частей длины k и для каждой части -- её цвет
- Переход = сортировка подсчетом пар <цвет первой половины, цвет второй половины>
- Собственно сортировка подсчетом и цифровая сортировка за O(n)
- Бонус
- Использование произведения многочленов для поиска подкартинки в картинке