#include <vector>
#include <iostream>
#include <memory>
class huffman_node
{
public:
bool internal_;
char symbol_;
int freq_;
std::unique_ptr<huffman_node> left_;
std::unique_ptr<huffman_node> right_;
public:
huffman_node() : internal_(true), symbol_('?') {}
huffman_node(char symb, int freq): internal_(false),
symbol_(symb),
freq_(freq) {}
huffman_node(huffman_node& other)
{
internal_ = other.internal_;
symbol_ = other.symbol_;
freq_ = other.freq_;
left_ = std::move(other.left_);
right_ = std::move(other.right_);
}
huffman_node & operator=(huffman_node& other)
{
internal_ = other.internal_;
symbol_ = other.symbol_;
freq_ = other.freq_;
left_ = std::move(other.left_);
right_ = std::move(other.right_);
return *this;
}
~huffman_node() {}
};
class huffman_encoder
{
public:
void make_huffman(
const std::vector<int>& freq,
const std::vector<char>& symb)
{
std::vector<std::unique_ptr<huffman_node>> nodes;
for (int i = 0; i < freq.size(); ++i)
{
std::unique_ptr<huffman_node> ph(new huffman_node(symb[i], freq[i]));
if (ph)
nodes.push_back(std::move(ph));
}
print_node(nodes);
}
void print_node(std::vector<std::unique_ptr<huffman_node>>& nodes)
{
for (auto &node : nodes)
{
std::cout << "symbol: " << node->symbol_ << " frequency: " << node->freq_ << std::endl;
}
}
};
int main()
{
std::vector<char> sym = {'a', 'b', 'c', 'd'};
std::vector<int> freq = { 5, 1, 3, 9};
huffman_encoder he;
he.make_huffman(freq, sym);
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgpjbGFzcyBodWZmbWFuX25vZGUKewpwdWJsaWM6CiAgICAgICAgYm9vbCBpbnRlcm5hbF87CiAgICAgICAgY2hhciBzeW1ib2xfOwogICAgICAgIGludCBmcmVxXzsKICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8aHVmZm1hbl9ub2RlPiBsZWZ0XzsKICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8aHVmZm1hbl9ub2RlPiByaWdodF87CnB1YmxpYzoKICAgICAgICBodWZmbWFuX25vZGUoKSA6IGludGVybmFsXyh0cnVlKSwgc3ltYm9sXygnPycpIHt9CiAgICAgICAgaHVmZm1hbl9ub2RlKGNoYXIgc3ltYiwgaW50IGZyZXEpOiBpbnRlcm5hbF8oZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sXyhzeW1iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXFfKGZyZXEpIHt9CiAgICAgICAgaHVmZm1hbl9ub2RlKGh1ZmZtYW5fbm9kZSYgb3RoZXIpCiAgICAgICAgewogICAgICAgICAgICAgICAgaW50ZXJuYWxfID0gb3RoZXIuaW50ZXJuYWxfOwogICAgICAgICAgICAgICAgc3ltYm9sXyA9IG90aGVyLnN5bWJvbF87CiAgICAgICAgICAgICAgICBmcmVxXyA9IG90aGVyLmZyZXFfOwogICAgICAgICAgICAgICAgbGVmdF8gPSBzdGQ6Om1vdmUob3RoZXIubGVmdF8pOwogICAgICAgICAgICAgICAgcmlnaHRfID0gc3RkOjptb3ZlKG90aGVyLnJpZ2h0Xyk7CiAgICAgICAgfQogICAgICAgIGh1ZmZtYW5fbm9kZSAmIG9wZXJhdG9yPShodWZmbWFuX25vZGUmIG90aGVyKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGludGVybmFsXyA9IG90aGVyLmludGVybmFsXzsKICAgICAgICAgICAgICAgIHN5bWJvbF8gPSBvdGhlci5zeW1ib2xfOwogICAgICAgICAgICAgICAgZnJlcV8gPSBvdGhlci5mcmVxXzsKICAgICAgICAgICAgICAgIGxlZnRfID0gc3RkOjptb3ZlKG90aGVyLmxlZnRfKTsKICAgICAgICAgICAgICAgIHJpZ2h0XyA9IHN0ZDo6bW92ZShvdGhlci5yaWdodF8pOwogICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICAgIH0KICAgICAgICB+aHVmZm1hbl9ub2RlKCkge30KfTsKCmNsYXNzIGh1ZmZtYW5fZW5jb2Rlcgp7CnB1YmxpYzoKICAgICAgICB2b2lkIG1ha2VfaHVmZm1hbigKICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGZyZXEsCiAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyPiYgc3ltYikKICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8aHVmZm1hbl9ub2RlPj4gbm9kZXM7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyZXEuc2l6ZSgpOyArK2kpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxodWZmbWFuX25vZGU+IHBoKG5ldyBodWZmbWFuX25vZGUoc3ltYltpXSwgZnJlcVtpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShwaCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJpbnRfbm9kZShub2Rlcyk7CiAgICAgICAgfQoKICAgICAgICB2b2lkIHByaW50X25vZGUoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPGh1ZmZtYW5fbm9kZT4+JiBub2RlcykKICAgICAgICB7CiAgICAgICAgCWZvciAoYXV0byAmbm9kZSA6IG5vZGVzKQogICAgICAgIAl7CiAgICAgICAgCQlzdGQ6OmNvdXQgPDwgInN5bWJvbDogIiA8PCBub2RlLT5zeW1ib2xfIDw8ICIgZnJlcXVlbmN5OiAiIDw8IG5vZGUtPmZyZXFfIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAJfQogICAgICAgIH0KfTsKCmludCBtYWluKCkKewogICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHN5bSA9IHsnYScsICdiJywgJ2MnLCAnZCd9OwogICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZnJlcSA9IHsgNSwgICAxLCAgIDMsICAgOX07CiAgICAgICAgaHVmZm1hbl9lbmNvZGVyIGhlOwogICAgICAgIGhlLm1ha2VfaHVmZm1hbihmcmVxLCBzeW0pOwogICAgICAgIHJldHVybiAwOwp9