Блог пользователя Tigutor

Автор Tigutor, история, 6 лет назад, По-русски

Вопрос в следующем — можно ли решить эту задачу(возможно, с долгим предпосчетом) быстрее, чем за линейное время? Я пока дошёл только до вычисления полиномиального хеша и сравнения двух подстрок за единицу, но перебрать их всё равно нужно O(n) Может, запоминать все позиции букв и идти только по префиксам с концом в букве, на которую заканчивается суффикс?

  • Проголосовать: нравится
  • -1
  • Проголосовать: не нравится

»
6 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

Можно найти длину максимального префикса совпадающего с суффиксом используя бинарный поиск(если префикс длины mid совпадает с суффиксом то префикс длины mid — 1 тоже совпадает с суффиксом)

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Что мешает считать $$$O(n)$$$ перебор за «долгий предподсчет»?

Вообще, эта задача решается префикс-функцией.

  • »
    »
    6 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    Нужно давать ответы для подстрок одной строки Найти Наибольший совпадающий префикс и суффикс для подстроки (I;j) Если делать это втупую, то будет кубическое время

»
6 лет назад, скрыть # |
 
Проголосовать: нравится +6 Проголосовать: не нравится

Как понимать «быстрее, чем за линейное время»? Строку, как минимумом, нужно считать(сгенерировать) за O(n). В строке есть какие-то изменения?

»
6 лет назад, скрыть # |
 
Проголосовать: нравится +11 Проголосовать: не нравится

Сначала научимся решать эту задачу для любого префикса заданной строки с преподсчетом за $$$O(n)$$$.

Насчитаем массив префикс функций $$$p$$$ (ссылка есть в комментарии выше). Таким образом мы узнаём для $$$i$$$-й позиции длину совпадающего префикса, что и является ответом на вышепоставленную задачу. Если поступает запрос про префикс строки, просто отвечаем $$$p_i$$$.

Чтобы находить ответ на любую подстроку, нужно заметить, что любую подстроку можно представить как префикс некоторого суффикса. Значит можно насчитать префикс функцию для всех суффиксов за $$$O(n^2)$$$ и отвечать на запрос за $$$O(1)$$$.

Также у меня есть предположение, что задачу можно решить значительно эффективней, используя суффиксные структуры.