Задача на префикс-функцию

Попалась задача с неприятным ограничением. Задача №123

Номер 123. Ограничение в том, что надо решить задачу использую только префикс-функцию без hash функции или чего-то другого. Буду благодарен за решение.

Я пытался приделывать перевернутую строку и по ней уже считать префикс-функцию. Но алгоритм оказался нерабочим


Ответы (1 шт):

Автор решения: MBo

Если не использовать алгоритм Манакера, а только префикс-функцию, то можно так:

Проходим диапазон длин 2..Len(s) поочередно, добавляем к подстроке s[1..n] спецсимвол, не встречающийся в строке, и перевернутую подстроку. Считаем префикс функцию - если её последний элемент больше единицы - нашли префикс-палиндром соответствующей длины.

Почему вставлять спецсимвол - чтобы 'aaa' давало 3, а не 6.
Почему по шагам - префикс-функция дает палиндром максимальной длины.
(Может, какой-то трюк можно придумать, начав с максимальной длины, и проходить не все длины)

P.S. Упомянутый в начале алгоритм позволяет за линейное время всё это сделать.

→ Ссылка