Матч
308, Декодирование
Хаффмана (HuffmanDecoding)
Дивизион 2,
Уровень 2
При кодировании методом Хаффмана
каждая буква кодируется строкой, состоящей из 0 и 1. При этом никакая строка не
является префиксом другой. Такое свойство кодов Хаффмана дает возможность
однозначного декодирования.
В массиве dictionary содержатся коды Хаффмана для букв: строка dictionary [i]
содержит код i – ой заглавной буквы. Необходимо декодировать строку archive, используя массив кодов dictionary.
Класс: HuffmanDecoding
Метод: string decode(string
archive, vector<string> dictionary)
Ограничения:
archive
содержит от 1 до 50 символов ‘0’ и ‘1’, dictionary содержит
от 1 до 26 строк, каждая строка dictionary[i] содержит
только символы ‘0’ и ‘1’.
Вход. Закодированная строка archive и набор строк dictionary, где dictionary [i] содержит код i – ой заглавной буквы.
Выход. Декодированная строка.
Пример входа
archive |
dictionary |
“101101” |
{“00”,“10”,“01”,“11”} |
“0001001100100111001” |
{“1”, “0”} |
“111011011000100110” |
{“010”,“00”,“0110”,“0111”,“11”,“100”,“101”} |
Пример выхода
“BDC”
“BBBABBAABBABBAAABBA”
“EGGFAC”
РЕШЕНИЕ
обработка строк
Строки из массива dictionary вместе буквами, которые они кодируют, храним в
отображении map<string, char> m. Если буква a кодируется строкой s, то m[s] = a.
Просматриваем строку
archive сначала
до конца и для каждого префикса s, являющийся кодом из dictionary, находим соответствующую букву m[s]. Эту букву дописываем в
результирующую строку res.
ПРОГРАММА
#include <cstdio>
#include <vector>
#include <map>
#include <string>
using namespace std;
class HuffmanDecoding
{
public:
string decode(string archive, vector <string> dictionary)
{
int i, ptr;
map<string,char> m;
string s,res="";
for(ptr = i = 0; i <
dictionary.size(); i++) m[dictionary[i]] = 'A'
+ i;
while(ptr < archive.size())
{
s = ""; while(!m[s]) s = s + archive[ptr++];
res += m[s];
}
return res;
}
};