#include"iostream"
#include"fstream"
using namespace std;
typedef struct node
{
char x;
int rchild ;
int lchild;
int weight;
int parent;
}Node;
void bianma(Node *tree,int n);
void yima(Node *tree,int n,int *a);
int main()
{
int i,n;
fstream fl1,fl2;
fl1.open("input.txt",ios::in);
fl1>>n;
Node *treenode= new node[2*n];
int *a=new int [n+1];
for(i=1;i<2*n;i++)
{
treenode[i].lchild=0;
treenode[i].rchild=0;
treenode[i].weight=0;
treenode[i].parent=0;
}
for(i=1;i<=n;i++)
{
fl1>>treenode[i].x>>treenode[i].weight;
}
bianma(treenode,n);
yima(treenode,n,a);
fl2.open ("output.txt",ios::out);
for(i=1;i<=n;i++)
{
fl2<<treenode[i].x<<" "<<a[i];
}
return 0;
}
void bianma(Node *tree,int n)
{
int i,j,tem[3],k[3],key=n;
while(key<2*n-1)
{
for(j=1;j<=2;j++)
{
for(i=1;i<=key;i++)
if(tree[i].parent==0)
{
tem[j ]=tree[i].weight;
k[j ]=i;
break;
}
for(i=1;i<=key;i++)
if(tree[i].parent==0 && tem[j]>tree[i].weight)
{
tem[j]=tree[i].weight;k[j]=i;
}
tree[k[j]].parent=key+1;
}
key++;
tree[key].rchild=k[1];
tree[key].lchild=k[2];
tree[key].weight=tree[k[1]].weight+tree[k[2]].weight;
}
}
void yima(Node *tree,int n,int *a)
{
int i,j,k;
for(i=1;i<=n;i++)
{
j=0;k=i;
while(tree[k].parent!=0)
{
j++;
k=tree[k].parent;
}
a[i]=j;
}
}
//老师的
#include<iostream>
#include<string.h>
using namespace std;
typedef struct TreeNode
{
char c;
int w;
int parent;
int right;
int left;
int tag;
char * code;
}Node;
void Find(Node * tree, int n, int & m1, int & m2)
{
m1 = -1;
while(tree[++ m1].tag != 0);
m2 = m1;
while(tree[++ m2].tag != 0);
for(int i = m2 + 1; i < n; i ++)
{
if(tree[i].tag == 0)
{
if(tree[i].w < tree[m1].w || tree[i].w < tree[m2].w)
{
if(tree[m2].w < tree[m1].w)
m1 = m2;
m2 = i;
}
}
}
}
void Huffman(Node * tree, int n)
{
int min1, min2;
for(int i = 0; i < n - 1; i ++)
{
Find(tree, n + i, min1, min2);
tree[n + i].w = tree[min1].w + tree[min2].w;
tree[n + i].left = min1;
tree[n + i].right = min2;
tree[n + i].tag = 0;
tree[n + i].parent = 0;
tree[min1].parent = n + i;
tree[min2].parent = n + i;
tree[min1].tag = 1;
tree[min2].tag = 1;
}
}
void HuffmanCoding(Node * tree, int n)
{
char * code = new char[n];
char * t = code + n - 1;
for(int i = 0; i < n; i ++)
{
int k = i;
code = t;
*code= '/0';
while(tree[k].parent != 0)
{
int p = tree[k].parent;
if(tree[p].left == k)
*(-- code) = '0';
else
*(-- code) = '1';
k = p;
}
tree[i].code = new char[strlen(code) + 1];
strcpy(tree[i].code, code);
cout<<tree[i].c<<" "<<tree[i].code<<endl;
}
//译码
{
cout<<"input string:"<<endl;
char c;
bool find = false;
while((c = getchar()) != '/n')
{
for(int i = 0; i < n; i ++)
{
if(tree[i].c == c)
{
cout<<tree[i].code;
find = true;
break;
}
}
if(find)
{
find = false;
}
else
{
cout<<"*";
break;
}
}
cout<<endl;
}
}
void HffmanDecoding(Node * tree, int n)
{
cout<<"input code:"<<endl;
char c;
int i = 2 * n - 2;
while((c = getchar()) != '/n')
{
if(c == '0')
{
i = tree[i].left;
}
else if(c == '1')
{
i = tree[i].right;
}
else
{
cout<<"*"<<endl;
break;
}
if(i < n)
{
cout<<tree[i].c;
i = 2 * n - 2;
}
}
}
int main()
{
int n;
cin>>n;
Node * tree = new Node[2 * n - 1];
for(int i = 0; i < n; i ++)
{
cin>>tree[i].c>>tree[i].w;
tree[i].tag = 0;
}
freopen("CON", "r", stdin);
Huffman(tree, n);
HuffmanCoding(tree, n);
HffmanDecoding(tree, n);
return 0;
}