Задачи на строки: какой приём когда
Четыре инструмента с сильно разными сильными сторонами. Таблица выбора и типовые постановки.
3 мин
В разделе набралось четыре независимых инструмента: префикс-функция, z-функция, автомат и бор. Плюс хеши из соседнего раздела.
Они пересекаются, но не заменяют друг друга.
Таблица выбора
| задача | чем решать |
|---|---|
| найти все вхождения одного шаблона | префикс-функция или хеши |
| то же, но текст в потоке и не влезает в память | префикс-функция |
| то же, но нужен точный ответ без вероятности | префикс-функция или z-функция |
| наименьший период, все периоды | префикс-функция |
| совпадение суффиксов с началом строки | z-функция |
| считать строки без вхождения шаблона | автомат |
| много запросов «дописать символ / откатить» | автомат |
| хранить набор строк, запросы по префиксам | бор |
| лексикографические запросы к набору строк | бор |
| сравнить два произвольных куска текста | хеши |
| наибольший общий префикс двух суффиксов | z-функция или хеши с бинпоиском |
Почему хеши не вытесняют остальное
Хеши короче и универсальнее: сравнить любые два куска за константу — это очень много.
Но у них три ограничения, и каждое где-нибудь да стреляет:
Вероятность. Ответ может быть неверным. На олимпиаде с открытыми тестами это ломают целенаправленно.
Нужен весь текст. Префиксные хеши считаются по массиву; в потоке их не построить.
Не дают структуры. Хеш отвечает «равны или нет». Он не скажет, чему равен период, и по нему не построить автомат для динамики.
Обратное тоже верно: там, где нужно сравнивать произвольные куски произвольных строк, префикс-функция бесполезна, а хеши решают задачу в две строки.
Типовые постановки
Строка — циклический сдвиг другой. Ищем в префикс-функцией.
Наименьшее дополнение до палиндрома. К строке надо приписать минимум символов справа, чтобы получился палиндром. Считаем префикс-функцию склейки ; последнее значение — длина наибольшего палиндромного суффикса, остаток дописываем зеркально.
Сколько раз каждый префикс встречается в строке. Обратный проход по : cnt[pi[i]-1] += cnt[i], справа налево.
Сжать строку до наименьшего повторяющегося блока. Период ; если на него делится — это ответ, иначе строка не сжимается нацело.
Максимальный xor пары чисел в наборе. Бор на двоичных записях: кладём числа, для каждого спускаемся, стараясь на каждом бите свернуть в противоположную сторону.
Количество строк длины без вхождения шаблона. Динамика по состояниям автомата.
Автодополнение: все строки набора с данным префиксом. Спуск по бору до конца префикса, дальше обход поддерева.
Чего в разделе нет
Тема на этом не заканчивается. За её пределами остались суффиксный массив, суффиксное дерево, автомат Ахо — Корасик для набора шаблонов и алгоритм Манакера для палиндромов. Все они строятся поверх того, что здесь есть: Ахо — Корасик — это автомат на боре, а суффиксный массив тесно связан с хешами и бинарным поиском.