A. Последовательность объединений
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Во всех задачах будем считать, что при одинаковой частоте меньшим узлом является тот, который содержит меньший байт. При объединении узлом меньший получает код 0, больший - 1.

Выведите последовательность объединений.

Входные данные

Строка символов с кодами от 32 до 127 в десятичной системе счисления.

Выходные данные

Выведите последовательность объединений в формате УЗЕЛ + УЗEЛ.

Узел выводится в формате КОДЫ УЗЛА в порядке возрастания в квадратных скобках через запятую:ОБЩАЯ ЧАСТОТА

Например, если объединяются два узла, в первом из которых a и d c частотой 2, а во втором e c частотой 50,

нужно выводить [97, 100]:2 + [101]:50

Пример

Входные данные
aaacccbbbddd
Выходные данные
[97]:3 + [98]:3
[99]:3 + [100]:3
[97, 98]:6 + [99, 100]:6

Примечание

Под частотой понимается количество символов.

Байты беззнаковые (со значениями 0-255)

B. Самый длинный код
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Во всех задачах будем считать, что при одинаковой частоте меньшим узлом является тот, который содержит меньший байт. При объединении меньший узел получает код 0, больший - 1.

Выведите самый длинный код, а если их несколько - лексикографически минимальный.

Входные данные

Строка символов с кодами от 32 до 127 в десятичной системе счисления.

Выходные данные

Выведите ответ в формате КОД СИМВОЛА:КОД ХАФФМАНА

Пример

Входные данные
12223334444
Выходные данные
49:110

Примечание

Под частотой понимается количество символов

C. Размер архива
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Во всех задачах будем считать, что при одинаковой частоте меньшим узлом является тот, который содержит меньший байт. При объединении меньший узел получает код 0, больший - 1.

Будем кодировать так: два байта на сигнатуру HA ("Haffman Archive"), потом остаток бит в последнем байте в трех битах, например, если в последнем байте будут значимыми только два бита, то записываем как 010. Дальше дерево. И потом код строки (файла).

Дерево записывается так

Если лист, то 0 (один бит) и соответствующий байт.

Если нет - 1 (один бит) и дальше левое поддерево и правое поддерево рекурсивно.

Выведите общее количество байт на кодирование.

Входные данные

Строка символов с кодами от 32 до 127 в десятичной системе счисления.

Выходные данные

Выведите одно число

Пример

Входные данные
aaaaaaaaaa
Выходные данные
5

Примечание

Под частотой понимается количество символов.

В примере 10 букв "а". Код "a" - однобитный, соответственно на дерево уйдет 9 бит, а сам код 10 бит. Плюс два байта сигнатуры. Плюс три бита на остаток. Получается 10+9+16+3 = 38 бит, поэтому нужно 5 байт.

D. Список кодов
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
input.dat
вывод
стандартный вывод

Во всех задачах будем считать, что при одинаковой частоте меньшим узлом является тот, который содержит меньший байт. При объединении меньший узел получает код 0, больший - 1.

Выведите все полученные коды в порядке возрастания значений байтов. (Байты считаются беззнаковыми со значениями 0..255)

Входные данные

Файл для архивирования

Выходные данные

Коды формате

Количество

Код1: значение

Код2: значение

...

Пример

Входные данные
12223334444
Выходные данные
4
49: 110
50: 111
51: 10
52: 0

Примечание

Под частотой понимается количество символов

E. Код начала
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Дан файл в виде hex-строки. Каждый байт файла представлен в ней двумя шестнадцатиричными цифрами.

Выведите начало кодировки по Хаффману (два символа сигнатуры, три бита остатка и дерево) в таком же виде.

Входные данные

Файл для кодирования в виде hex-строки

Выходные данные

Закодированные начало в виде hex-строки

Пример

Входные данные
61
Выходные данные
4841a610

F. Запись в файл
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
input.dat
вывод
output.ha

Во всех задачах будем считать, что при одинаковой частоте меньшим узлом является тот, который содержит меньший байт. При объединении меньший узел получает код 0, больший - 1.

"Заархивируйте" файл по алгоритму предыдущей задачи.

Входные данные

Файл для кодирования

Выходные данные

Закодированный файл

Примечание

Под частотой понимается количество символов

G. Чтение из файла
ограничение по времени на тест
1 секунда
ограничение по памяти на тест
256 мегабайт
ввод
input.ha
вывод
output.dat

Во всех задачах будем считать, что при одинаковой частоте меньшим узлом является тот, который содержит меньший байт. При объединении меньший узел получает код 0, больший - 1.

Разархивируйте файл, сжатый по алгоритму предыдущей задачи.

Входные данные

Файл для разархивирования

Выходные данные

Разархивированный файл

Примечание

Под частотой понимается количество символов