- Описание
- Отправленные решения
16. Архивирование
В одном из алгоритмов сжатия используется следующая процедура разбиения данных на блоки:
- Первый символ строки образует первый блок.
- Выбирается наибольший префикс данных $p$, который уже есть среди блоков.
- Если $p$ достиг конца данных, то он является последним блоком.
- Строка $p$+$c$, где $c$ — следующий символ, является следующим блоком.
- Алгоритм переходит ко второму шагу и продолжает обрабатывать данные, начиная с первого символа, который не входит ни в один из блоков.
Например, строка данных 11001110011
будет разбита на блоки 1
, 1+0=10
, 0
, 1+1=11
, 10+0=100
и 11
.
А строка 1111111
будет разбита на блоки 1
, 11
, 111
и 1
.
Формат ввода
В единственной строке дана непустая строка $s$, состоящая из $0$ и $1$. Постройте ее разбиение на блоки. Длина строки $s$ не превосходит $1\,000\,000$.
Формат вывода
В единственной строке выведите через пробел блоки, на которые разбивается строка $s$.
Ограничения
Ограничение времени
5 с
Ограничение памяти
256 МБ
Пример 1
Ввод
11001110011
Вывод
1 10 0 11 100 11
Пример 2
Ввод
1111111
Вывод
1 11 111 1
Пример 3
Ввод
10101010111110000101010010
Вывод
1 0 10 101 01 11 110 00 010 1010 010
Пример 4
Ввод
000001111110000001111110000110
Вывод
0 00 001 1 11 110 000 0011 111 10 0001 10