eolymp
bolt
Попробуйте наш новый интерфейс для отправки задач
Задачи

Дерево Хаффмана

Дерево Хаффмана

Относительно простой метод сжатия данных может быть выполнен путём создания так называемых деревьев Хаффмана для файла и используется для его сжатия и распаковки данных в нём. Для большинства приложений используются бинарные деревья Хаффмана (например, каждый узел является либо листом, либо имеет ровно два подузла). Можно, однако, построить деревья Хаффмана с произвольным числом поддеревьев (например, троичных или, в общем случае, \textbf{N}-ичных деревьев). Дерево Хаффмана для файла, содержащего \textbf{Z} разных символов имеет \textbf{Z} листьев. Путь от корня к листу, который представляет определенный символ, определяет кодировку, и каждый шаг на пути к листу определяет кодировку (которая может быть \textbf{0}, \textbf{1}, ..., \textbf{(N-1)}). Путём размещения часто встречающихся символы ближе к корню, и менее часто встречающихся символов дальше от корня, и достигается желаемое сжатие. Строго говоря, такое дерево будет деревом Хаффмана, только если в результате кодирования будет использовано минимальное число \textbf{N}-ичных символов для кодирования заданного файла. В этой задаче мы будем рассматривать только деревья, где каждый узел является либо внутренним узлом либо листом кодирования символов и нет изолированных листьев, которые не кодируют символ. На рисунке ниже показан пример троичного дерева Хаффмана, символы '\textbf{a}' и '\textbf{е}' кодируются с помощью одной троичного символа; менее часто встречающиеся символы '\textbf{s}' и '\textbf{p}' кодируются с помощью двух троичных символов и наиболее редко встречающиеся символы '\textbf{x}', '\textbf{q}' и '\textbf{y}' кодируются с помощью трех троичных символов каждый. \includegraphics{https://static.e-olymp.com/content/44/440d9c2a24e56ece64e196a6dd41ace76285106e.jpg} Конечно, если мы хотим, чтобы можно развернуть список \textbf{N}-ичных символов потом обратно, важно знать, какое дерево используется для сжатия данных. Это можно сделать несколькими способами. В этой задаче мы будем использовать следующий метод: потоку входных данных будет предшествовать заголовок, состоящий из закодированных значений символов \textbf{Z}, находящихся в исходном файле в лексикографическом порядке. Зная количество входных символов \textbf{Z}, значение \textbf{N}, обозначающее "\textbf{N}-арность" дерева Хаффмана и сам заголовок, необходимо найти первичное значение закодированных символов. \InputFile Входные данные начинаются с целого числа \textbf{T}, расположенного в отдельной строке и обозначающего количество последующих тестовых случаев. Далее задано каждый из \textbf{T} тестовых случаев, каждый из которых расположен в \textbf{3}-х строках следующим образом: \begin{itemize} \item Количество различных символов в тестовом случае \textbf{Z} (\textbf{2} ≤ \textbf{Z} ≤ \textbf{20}); \item Число \textbf{N}, обозначающее "\textbf{ N} -арность" дерева Хаффмана (\textbf{2} ≤ \textbf{N} ≤ \textbf{10}); \item Строка, представляющая заголовок полученного сообщения, каждый символ будет цифрой в диапазоне \textbf{\[0, (N-1)\]}. Эта строка будет содержать меньше \textbf{200} символов. \end{itemize} \textit{\textbf{Примечание:}} Хотя и редко, но это возможно для заголовка, чтобы иметь несколько толкований при расшифровке (например, для заголовка '\textbf{010011101100}', и значениях \textbf{Z = 5} и \textbf{N = 2}). Гарантируется, что во всех предлагаемых во входных данных тестовых случаях, имеется единственное решение. \OutputFile Для каждого из \textbf{T} тестовых случаев вывести \textbf{Z} строк, дающих декодированную версию каждого из \textbf{Z} символов в порядке возрастания. Используйте формат \textbf{оригинал->кодировка}, где \textbf{оригинал} -- это десятичное число в диапазоне \textbf{\[0, (Z-1)\]} и соответствующая кодированная строка кодированных цифр для этих символов (каждая цифра ≥ \textbf{0} и < \textbf{N}).
Лимит времени 3 секунды
Лимит использования памяти 32 MiB
Входные данные #1
3 
3 
2 
10011 
4 
2 
000111010 
19 
10 
01234678950515253545556575859
Выходные данные #1
0->10
1->0
2->11
0->00
1->011
2->1
3->010
0->0
1->1
2->2
3->3
4->4
5->6
6->7
7->8
8->9
9->50
10->51
11->52
12->53
13->54
14->55
15->56
16->57
17->58
18->59
Источник ACM ICPC NWERC 2002