Линдон слово факторизация

11

Фон

Линдон слово не является пустой строкой , которая является строго лексикографический меньше , чем всеми остальными его вращения. Можно объединить любую строку однозначно как конкатенацию слов Линдона так, что эти подслова лексикографически не увеличиваются; Ваша задача - сделать это как можно более кратко.

подробности

Вы должны реализовать функцию или программу, которая перечисляет факторизацию слова Линдона любой печатаемой строки ASCII, по порядку, выводя результирующие подстроки в виде массива или потока некоторого вида. Символы должны сравниваться по их кодам, и разрешены все стандартные методы ввода и вывода. Как обычно для , выигрывает самая короткая программа в байтах.

Тестовые случаи

''           []
'C'          ['C']
'aaaaa'      ['a', 'a', 'a', 'a', 'a']
'K| '        ['K|', ' ']
'abaca'      ['abac', 'a']
'9_-$'       ['9_', '-', '$']
'P&O(;'      ['P', '&O(;']
'xhya{Wd$'   ['x', 'hy', 'a{', 'Wd', '$']
'j`M?LO!!Y'  ['j', '`', 'M', '?LO', '!!Y']
'!9!TZ'      ['!9!TZ']
'vMMe'       ['v', 'MMe']
'b5A9A9<5{0' ['b', '5A9A9<5{', '0']
user1502040
источник
Обратите внимание, что это эквивалентно расщеплению по <=ness. (
CalculatorFeline
Это эквивалентно многократному взятию первого символа и префикса всех символов больше его?
xnor
@xnor Нет. «abac» - это слово Линдона.
user1502040
@ user1502040 Понятно, связи интересны. Я бы предложил добавить несколько тестовых случаев, которые это улавливают.
xnor

Ответы:

5

Pyth, 17 16 байт

-1 байт благодаря isaacg!

hf!ff>Y>YZUYT+./

Попробуйте онлайн!

объяснение

hf!ff>Y>YZUYT+./
              ./    Take all possible disjoint substring sets of [the input]
             +      plus [the input] itself (for the null string case).
 f                  Filter for only those sets which
  !f        T       for none of the substrings
    f  >YZUY        is there a suffix of the substring
     >Y             lexographically smaller than the substring itself.
h                   Return the first (i.e. the shortest) such set of substrings.
notjagan
источник
1
hf!ff>Y>YZUYT+./учитывает случай пустой строки с 1 байт меньше.
Исаак
Хорошо, спасибо! Я чувствовал, что, должно быть, был более короткий путь.
notjagan