Декодирование циклического сдвига строки с повторяющимся шаблоном

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