Изменения
Нет описания правки
{{Шаблон:Задача
|definition =
Пусть дана строка <tex>s</tex>, требуется посчитать количество подпалиндромов [[Основные_определения,_связанные_со_строками#palindrome | палиндромов]] в ней за <tex>O(|s|\cdot\log{|s|)}</tex>c помощью хешей.
}}
== Алгоритм ==
=== Идея ===
Рассмотрим сначала задачу поиска палиндромов нечетной длины. Для каждой позиции в строке <tex>s</tex> найдем длину наибольшего палиндрома с центром в этой позиции. Длину Очевидно, что если строка <tex>t</tex> является палиндромом, то строка полученная вычеркиванием первого и последнего символа из <tex>t</tex> также является палиндромом. Поэтому длину палиндрома будем можно искать [[Целочисленный_двоичный_поиск | бинарным поиском]]. Для сохранения асимптотики проверку совпадения левой и правой половины требуется выполнить за <tex>O(1)</tex>. Для этого можно воспользоваться методом хеширования. Для палиндромов четной длины алгоритм такой же, только следует проверять вторую строку со сдвигом на единицу, при этом мы не посчитаем никакой палиндром дважды из-за четности-нечетности палиндромов.
=== Псевдокод ===
'''int''' binarySearch(s : '''string''', center, shift : '''int'''):
=== Избавление от коллизий ===
Итоговая асимптотика алгоритма: предподсчет за построение суффиксного массива и <tex>O(\log(|s|)</tex> на запрос, если предподсчитать все <tex>k</tex>, то <tex>O(1)</tex>.
*[[Поиск наибольшей общей подстроки двух строк с использованием хеширования]]
==Источники информации==
* [http://e-maxx.ru/algo/suffix_array#5 MAXimal :: algo :: Суффиксный массив]
[[Категория:Алгоритмы и структуры данных]]
[[Категория:Суффиксный массив]]