#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <string>
#include <fstream>
using namespace std;
class Node {
public:
int a;
char c;
Node *left, *right;
Node() {}
Node(Node *L, Node *R){
left=L;
right =R;
a=L->a + R->a;
}
};
struct MyCompare {
bool operator() (Node *l, Node *r) const
{ return l->a < r->a;}
};
void BuildTable(Node *root, vector<bool> &code, map<char, vector<bool> > &table)
{
if (root->left){
code.push_back(0);
BuildTable(root->left, code, table);
}
if (root->right){
code.push_back(1);
BuildTable(root->right, code, table);
}
if (root->c)
table[root->c] = code;
if (code.size())
code.pop_back();
}
int main()
{
ifstream f("l.txt") ;
map <char, int> m;
while(!f.eof()) {
char c=f.get();
m[c]++;
}
list<Node*> t;
map <char, int> :: iterator i;
for(i=m.begin(); i!=m.end(); i++){
Node *p=new Node;
p->c=i->first;
p->a=i->second;
t.push_back(p);
}
while (t.size()!=1){
t.sort(MyCompare());
Node *SonL=t.front();
t.pop_front();
Node *SonR=t.front();
t.pop_front();
Node *parent= new Node(SonL, SonR);
t.push_back(parent);
}
Node *root=t.front();
vector <bool> code;
map <char, vector<bool> > table;
BuildTable(root, code, table);
for (i = m.begin(); i != m.end(); i++)
{
if((int (i->first))==10) cout<<"\n" << "-" << i->second;
cout << i->first << " - "<< i->second<< " ";
for (int j = 0; j < table[i->first].size(); j++)
cout << table[i->first][j];
cout << endl;
}
while(!f.eof()){
char c=f.get();
for (int j = 0; j < table[c].size(); j++){
cout << table[c][j];
}
}
cout <<endl;
f.close();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGZzdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKCmNsYXNzIE5vZGUgewogICAgcHVibGljOgogICAgaW50IGE7CiAgICBjaGFyIGM7CiAgICBOb2RlICpsZWZ0LCAqcmlnaHQ7CiAgICBOb2RlKCkge30KICAgIE5vZGUoTm9kZSAqTCwgTm9kZSAqUil7CiAgICAgICAgbGVmdD1MOwogICAgICAgIHJpZ2h0ID1SOwogICAgICAgIGE9TC0+YSArIFItPmE7CiAgICB9Cn07CgpzdHJ1Y3QgTXlDb21wYXJlIHsKICAgIGJvb2wgb3BlcmF0b3IoKSAoTm9kZSAqbCwgTm9kZSAqcikgY29uc3QKICAgIHsgcmV0dXJuIGwtPmEgPCByLT5hO30KfTsKdm9pZCBCdWlsZFRhYmxlKE5vZGUgKnJvb3QsIHZlY3Rvcjxib29sPiAmY29kZSwgbWFwPGNoYXIsIHZlY3Rvcjxib29sPiA+ICZ0YWJsZSkgCnsKCWlmIChyb290LT5sZWZ0KXsKCQljb2RlLnB1c2hfYmFjaygwKTsKCQlCdWlsZFRhYmxlKHJvb3QtPmxlZnQsIGNvZGUsIHRhYmxlKTsKCX0KCWlmIChyb290LT5yaWdodCl7CgkJY29kZS5wdXNoX2JhY2soMSk7IAoJCUJ1aWxkVGFibGUocm9vdC0+cmlnaHQsIGNvZGUsIHRhYmxlKTsKCX0KCWlmIChyb290LT5jKQoJCXRhYmxlW3Jvb3QtPmNdID0gY29kZTsKCWlmIChjb2RlLnNpemUoKSkKCQljb2RlLnBvcF9iYWNrKCk7Cn0KCmludCBtYWluKCkKewogICAKICAgaWZzdHJlYW0gZigibC50eHQiKSA7CiAgIG1hcCA8Y2hhciwgaW50PiBtOwogICB3aGlsZSghZi5lb2YoKSkgewogICAgICAgY2hhciBjPWYuZ2V0KCk7CiAgICAgICBtW2NdKys7CiAgIH0KICAgCiAgIGxpc3Q8Tm9kZSo+IHQ7CiAgIG1hcCA8Y2hhciwgaW50PiA6OiBpdGVyYXRvciBpOwogICBmb3IoaT1tLmJlZ2luKCk7IGkhPW0uZW5kKCk7IGkrKyl7CiAgICAgICBOb2RlICpwPW5ldyBOb2RlOwogICAgICAgcC0+Yz1pLT5maXJzdDsKICAgICAgIHAtPmE9aS0+c2Vjb25kOwogICAgICAgdC5wdXNoX2JhY2socCk7CiAgIH0KICAgd2hpbGUgKHQuc2l6ZSgpIT0xKXsKICAgICAgIHQuc29ydChNeUNvbXBhcmUoKSk7CiAgICAgICBOb2RlICpTb25MPXQuZnJvbnQoKTsKICAgICAgIHQucG9wX2Zyb250KCk7CiAgICAgICBOb2RlICpTb25SPXQuZnJvbnQoKTsKICAgICAgIHQucG9wX2Zyb250KCk7CiAgICAgICBOb2RlICpwYXJlbnQ9IG5ldyBOb2RlKFNvbkwsIFNvblIpOwogICAgICAgdC5wdXNoX2JhY2socGFyZW50KTsKICAgfQogICBOb2RlICpyb290PXQuZnJvbnQoKTsKICAgCiAgIHZlY3RvciA8Ym9vbD4gY29kZTsKbWFwIDxjaGFyLCB2ZWN0b3I8Ym9vbD4gPiB0YWJsZTsKICAgQnVpbGRUYWJsZShyb290LCBjb2RlLCB0YWJsZSk7CiAgIGZvciAoaSA9IG0uYmVnaW4oKTsgaSAhPSBtLmVuZCgpOyBpKyspCgl7CgkJaWYoKGludCAoaS0+Zmlyc3QpKT09MTApIGNvdXQ8PCJcbiIgPDwgIi0iIDw8IGktPnNlY29uZDsKCQljb3V0IDw8IGktPmZpcnN0IDw8ICIgLSAiPDwgaS0+c2Vjb25kPDwgIiAiOwoJCWZvciAoaW50IGogPSAwOyBqIDwgdGFibGVbaS0+Zmlyc3RdLnNpemUoKTsgaisrKQoJCQljb3V0IDw8IHRhYmxlW2ktPmZpcnN0XVtqXTsKCQljb3V0IDw8IGVuZGw7Cgl9Cgl3aGlsZSghZi5lb2YoKSl7CiAgICAgICAgICBjaGFyIGM9Zi5nZXQoKTsKICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFibGVbY10uc2l6ZSgpOyBqKyspewoJCQljb3V0IDw8IHRhYmxlW2NdW2pdOwoJCSAgIH0KICAgICAgICB9CiAgICAgICAgY291dCA8PGVuZGw7CiAgICAgICAgZi5jbG9zZSgpOwoJCgogICAgcmV0dXJuIDA7Cn0K