#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEAF 8
#define MAX_NODE (2 * MAX_LEAF - 1)
#define MAX_CODE_LEN 105
typedef struct {
int weight;
int parent;
int lchild;
int rchild;
char value;
} HTNode, *HuffmanTree;
char chars[MAX_LEAF] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
int weights[MAX_LEAF] = {7, 19, 2, 6, 32, 3, 21, 10};
void Select(HuffmanTree HT, int n, int *s1, int *s2) {
int min1 = 1000000;
int min2 = 1000000;
*s1 = -1;
*s2 = -1;
for (int i = 0; i < n; i++) {
if (HT[i].parent == -1) {
if (HT[i].weight < min1) {
min2 = min1;
*s2 = *s1;
min1 = HT[i].weight;
*s1 = i;
} else if (HT[i].weight < min2) {
min2 = HT[i].weight;
*s2 = i;
}
}
}
}
void CreateHuffmanTree(HuffmanTree *HT, int n) {
if (n <= 1) return;
int m = 2 * n - 1;
*HT = (HuffmanTree)malloc(m * sizeof(HTNode));
for (int i = 0; i < n; i++) {
(*HT)[i].weight = weights[i];
(*HT)[i].parent = -1;
(*HT)[i].lchild = -1;
(*HT)[i].rchild = -1;
(*HT)[i].value = chars[i];
}
for (int i = n; i < m; i++) {
(*HT)[i].weight = 0;
(*HT)[i].parent = -1;
(*HT)[i].lchild = -1;
(*HT)[i].rchild = -1;
(*HT)[i].value = '#';
}
int s1, s2;
for (int i = n; i < m; i++) {
Select(*HT, i, &s1, &s2);
(*HT)[i].weight = (*HT)[s1].weight + (*HT)[s2].weight;
(*HT)[i].lchild = s1;
(*HT)[i].rchild = s2;
(*HT)[s1].parent = i;
(*HT)[s2].parent = i;
}
}
void Decode(HuffmanTree HT, int n, char *code) {
int root = 2 * n - 2;
int curr = root;
int len = strlen(code);
for (int i = 0; i < len; i++) {
if (code[i] == '0') {
curr = HT[curr].lchild;
} else if (code[i] == '1') {
curr = HT[curr].rchild;
}
if (HT[curr].lchild == -1 && HT[curr].rchild == -1) {
printf("%c", HT[curr].value);
curr = root;
}
}
printf("\n");
}
int main() {
HuffmanTree HT;
char inputCode[MAX_CODE_LEN];
CreateHuffmanTree(&HT, MAX_LEAF);
if (scanf("%s", inputCode) != 1) {
return 0;
}
Decode(HT, MAX_LEAF, inputCode);
free(HT);
return 0;
}