Привет! http://informatics.mccme.ru/moodle/mod/statements/view3.php?id=7841&chapterid=111743#1 интересует решение данной задачи, покачто придумал решение за куб (для каждой длины последовательности сколько раз она встречается) и просто проверить их все, должно зайти для http://www.e-olimp.com/problems/2320 , но для n<=150000...
Должны помочь суффиксные структуры: суффиксный массив/дерево/автомат. Например, с точки зрения дерева надо всего лишь посмотреть все его вершины (а их линия) и для каждой уметь быстро понимать, сколько раз соответствующая подстрока встречается в строке (это делается простым предподсчётом).
Мне они кажутся довольно сложной темой (в порядке сложности: массив, автомат, дерево). К сожалению, с ходу не могу привести ссылки, где хорошо описано.
спасибо, попробую сам что-нибудь найти
Хорошо вам, даже е-макса читать не приходится...
Для автора топика: массив, автомат, дерево. Дерево в этой статье, правда, не описано, но есть ссылка на книгу Гасфилда, в которой оно есть.
Будем тернарным поиском перебирать длину ответа. На каждой итерации нам нужно будет уметь узнавать максимальное число вхождений по всем подстрокам длины X. Это можно узнать за O(NlogN), используя хеши. Эта величина — максимальное число вхождений по всем подстрокам длины X, монотонно убывает с увеличением Х. Х, собственно, монотонно возрастает с увеличением Х. Тогда функция f(X) = Х * < максимальное число вхождений по всем подстрокам длины Х > удовлетворяет условиям тернарного поиска.
Это правда или нет?
Про функцию — нет:
В этом моменте, собственно, и сомневался. Спасибо.
O(n*log(n))
O(n)
реализацияРешение суффиксным автоматом: code Идея: аналогично поиску количества вхождений подстроки в тексте(посмотреть можно на e-maxx.ru) найдем для каждого состояния v размер множества endpos(v), теперь собственно найдем то состояние, для которого искомая величина максимальна. Теперь осталось найти соответствующую подстроку, я это делал так, найдем для каждого состояния, можно ли по суффиксным ссылкам достигнуть искомое состояние(это делается ленивой динамикой, например). А потом просто шел по строке и переходил по символам, и как только попадал в состояние, из которого достижимо искомое состояние, выводил последние len(v) символов. Со слов может непонятно)) Надеюсь код исправит все непонятности.
зы. Теперь вопрос от меня сообществу, можно ли находить подстроку максимальной длины соответствующую определенному состоянию умнее, чем это делал я, а то мне кажется, что какой-то костыль придумал=)
ADD: Господа минусующие, вы хотя бы свои комменты давали по этому поводу. Код работает, причем асимптотически оптимально. Что не так?