Декодирование циклического сдвига строки с повторяющимся шаблоном
Kotlin
Сложный
strings
Задача «Декодирование циклического сдвига строки с повторяющимся шаблоном»
Дана закодированная строка, полученная из исходной строки путём циклического сдвига влево на некоторое число K (0 ≤ K < длины строки) и последующей замены каждого символа на его ASCII-код, записанный в десятичной системе счисления. Исходная строка состоит только из латинских букв нижнего регистра (a-z) и имеет длину не более 1000. Известно, что исходная строка является результатом многократного повторения некоторого шаблона (паттерна) длины P (1 ≤ P ≤ длина строки) — т.е. строка имеет вид S = T + T + ... + T (целое число раз). Необходимо найти длину минимального возможного шаблона P и восстановить исходную строку до циклического сдвига. Если существует несколько возможных исходных строк, выбрать ту, которая лексикографически минимальна (в исходном, не сдвинутом виде). Входные данные: одна строка, содержащая последовательность целых чисел, разделённых пробелами — это закодированная строка. Длина последовательности — L (1 ≤ L ≤ 2000). Выходные данные: два числа — длина минимального шаблона P и значение сдвига K, а затем на следующей строке — восстановленную исходную строку (до сдвига). Если восстановление невозможно, вывести -1.
Формат ввода
Одна строка, содержащая целые числа через пробел — коды символов закодированной строки.
Формат вывода
В первой строке два целых числа: P и K. Во второй строке — исходная строка до сдвига. Если решение не найдено, вывести -1.
Примеры
Пример 1
ВВОД
99 97 98 99 97 98
ВЫВОД
3 1
abcabc
Пример 2
ВВОД
97 98 97 98
ВЫВОД
2 0
abab
main.kt