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

Автор Guliash, 10 лет назад, По-русски

Привет! Читаю про префикс-функцию на e-maxx и не могу понять пункт про сжатие строки. А именно, из чего следует в части где n не делится на k, что все буквы блока совпадают? В примере на картинке это очевидно. А что если у нас сдвиг суффикса относительно второго блока будет больше чем на 1 символ?

http://e-maxx.ru/algo/prefix_function#12

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

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

Это следует из каких-то заблуждений. Вот пример строки из 20 символов:

12345678123456781234

В обозначениях e-maxx: k = 8 и пусть p = 10, тогда si = si + 2.

|----p---||---p----|
12345678123456781234

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

    Спасибо за ответ!

    Но я не думаю, что здесь стоит использовать реальный пример. Во-первых, период p (в приведённом примере), очевидно, периодом не является. Если предположить, что утверждение 'если n не делится k, тогда сжатия не существует' верно, то реального примера и не получится привести. Поэтому, думаю, следует уйти от реальных примеров к абстрактным.

    Ну или привести контрпример в котором, существует период p при заданных условиях:)

    Если я неправильно Вас понял, поправьте, пожалуйста.

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

      Можно абстрагироваться так: воспринимайте цифры в строке не как символы, а как s1, s2, ..., s8. Мы пользуемся повторяющейся нумерацией, потому что нам известна длина строки (20) и значение префикс-функции для последней позиции (12), откуда следует, что si = si + 8. Тогда предположив, что p является периодом строки, мы получаем, что еще и si = si + 2 (по картинке). Но мы не получаем si = si + 1, как написано на e-maxx.

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

        Но тогда p не ответ и префикс функция посчитана неверно получается.

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

          Ну да, в этом и состоит смысл доказательства от противного) Мы же не теорему опровергаем, а просто указываем на ошибку в доказательстве на e-maxx и отвечаем на ваш вопрос из поста: не всегда из того, что n не делится на k следует, что все буквы блока совпадают.

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

            Но доказательство на e-maxx опирается на то, что p ответ (то есть минимальный период). А мы же всего лишь навсего доказали, что 10 не ответ.

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

              Доказательство в своей последней части нигде на минимальность не опирается.

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

                Может я неверно что-то понял..

                "Найти такую строку t наименьшей длины, что s можно представить в виде конкатенации одной или нескольких копий t. Понятно, что проблема является в нахождении длины искомой строки t. Зная длину, ответом на задачу будет, например, префикс строки s этой длины"

                "Докажем от противного — предположим, что ответ существует, и имеет длину p"

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

                  Ну написано так в предположении, дальше-то это никак не используется.

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

                  Это, конечно, верно, что дальше нигде не используется. Тогда, наверное, лучше бы опираться. То есть нужно приводить к противоречию, что p можно уменьшить. Случай p == 1 не рассматривается, так как он очевиден.

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

А что если у нас сдвиг суффикса относительно второго блока будет больше чем на 1 символ?

Наверно можно доказать, что в этом случае блок p состоит из повторяющихся строк длины gcd(k, p).

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

    Да, скорее всего так и есть. Учитывая, что суффикс заезжает на первый блок на p mod k, то величина этого "заезда" кратна gcd(k, p). Тогда можно перейти к блокам длины gcp(k, p). Остаётся лишь доказать, что все такие блоки одинаковы.

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

Мне удалось найти поистине удивительное доказательство этой теоремы, но поля этого блога слишком малы, чтобы его привести... Поэтому оставляю ссылку (последняя теорема).