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

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

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

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

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

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

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

    Контрпример: abctreabc То есть abc это общий префикс/суффикс, а ab нет

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

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

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

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

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

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

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

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

    Предподсчитать за n^2 и давать ответ за запрос для любой подстроки быстро

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

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

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

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

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