#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;
using Dict = unordered_map<size_t, size_t>;
class CoDec
{
Dict dict;
public:
size_t code(const size_t in)
{
//ищем в словаре
const auto pos = dict.find(in);
if(pos==dict.end())
{
//если не нашли, пополняем словарь
//присваиваем новый код, равный прошлой длине словаря;
const size_t cnt=dict.size();
return dict[in] = cnt;
}
return pos->second; //если нашли, просто выдаем словарное значение
}
size_t decode(const size_t in) const
{
//выдаем из словаря нужное значение по коду
return find_if(dict.cbegin(), dict.cend(), [&in](const Dict::value_type& a)
{
return in == a.second;
})->first;
}
};
int main()
{
CoDec cdc;
cout << cdc.code(2) <<' '<< cdc.code(5) <<' '<< cdc.code(8) <<' '<< cdc.code(5) << endl ;
cout << cdc.decode(0)<<' '<< cdc.decode(1) <<' '<< cdc.decode(2)<<' '<< cdc.decode(1)<< endl;
return 0;
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KICAgICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogICAgI2luY2x1ZGUgPGFsZ29yaXRobT4KICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAKICAgIHVzaW5nIERpY3QgPSB1bm9yZGVyZWRfbWFwPHNpemVfdCwgc2l6ZV90PjsKICAgIAogICAgY2xhc3MgQ29EZWMKICAgIHsKICAgIAlEaWN0IGRpY3Q7CiAgICBwdWJsaWM6CiAgICAJc2l6ZV90IGNvZGUoY29uc3Qgc2l6ZV90IGluKQogICAgCXsKICAgICAgICAgICAgLy/QuNGJ0LXQvCDQsiDRgdC70L7QstCw0YDQtQogICAgCQljb25zdCBhdXRvIHBvcyA9IGRpY3QuZmluZChpbik7CiAgICAJCWlmKHBvcz09ZGljdC5lbmQoKSkKICAgIAkJewogICAgICAgICAgICAgICAgLy/QtdGB0LvQuCDQvdC1INC90LDRiNC70LgsINC/0L7Qv9C+0LvQvdGP0LXQvCDRgdC70L7QstCw0YDRjAogICAgICAgICAgICAgICAgLy/Qv9GA0LjRgdCy0LDQuNCy0LDQtdC8INC90L7QstGL0Lkg0LrQvtC0LCDRgNCw0LLQvdGL0Lkg0L/RgNC+0YjQu9C+0Lkg0LTQu9C40L3QtSDRgdC70L7QstCw0YDRjzsKICAgIAkJCWNvbnN0IHNpemVfdCBjbnQ9ZGljdC5zaXplKCk7CiAgICAJCQlyZXR1cm4gZGljdFtpbl0gPSBjbnQ7CiAgICAJCX0gICAgICAgICAgICAKICAgIAkJcmV0dXJuIHBvcy0+c2Vjb25kOyAvL9C10YHQu9C4INC90LDRiNC70LgsINC/0YDQvtGB0YLQviDQstGL0LTQsNC10Lwg0YHQu9C+0LLQsNGA0L3QvtC1INC30L3QsNGH0LXQvdC40LUKICAgIAl9CiAgICAJc2l6ZV90IGRlY29kZShjb25zdCBzaXplX3QgaW4pIGNvbnN0CiAgICAJewogICAgICAgICAgICAvL9Cy0YvQtNCw0LXQvCDQuNC3INGB0LvQvtCy0LDRgNGPINC90YPQttC90L7QtSDQt9C90LDRh9C10L3QuNC1INC/0L4g0LrQvtC00YMKICAgIAkJcmV0dXJuIGZpbmRfaWYoZGljdC5jYmVnaW4oKSwgZGljdC5jZW5kKCksIFsmaW5dKGNvbnN0IERpY3Q6OnZhbHVlX3R5cGUmIGEpCiAgICAJCXsKICAgIAkJCXJldHVybiBpbiA9PSBhLnNlY29uZDsKICAgIAkJfSktPmZpcnN0OwogICAgCX0KICAgIH07CiAgICAKICAgIGludCBtYWluKCkgCiAgICB7CiAgICAJQ29EZWMgY2RjOwogICAgCWNvdXQgPDwgY2RjLmNvZGUoMikgIDw8JyAnPDwgY2RjLmNvZGUoNSkgICA8PCcgJzw8IGNkYy5jb2RlKDgpICA8PCcgJzw8IGNkYy5jb2RlKDUpICA8PCBlbmRsIDsKICAgIAljb3V0IDw8IGNkYy5kZWNvZGUoMCk8PCcgJzw8IGNkYy5kZWNvZGUoMSkgPDwnICc8PCBjZGMuZGVjb2RlKDIpPDwnICc8PCBjZGMuZGVjb2RlKDEpPDwgZW5kbDsKICAgIAlyZXR1cm4gMDsKICAgIH0=