#include <bits/stdc++.h>
using namespace std;
typedef struct Node
{
int l, r, parent;
char data;
int weight;
string num;
} *Tr, N;
typedef struct MIN
{
int s1, s2;
} MIN, Min;
MIN select(Tr huf, int num)
{
int s1, s2;
s1 = s2 = 1;
int min1, min2;
min1 = 100000, min2 = 100000;
for (int i = 1; i <= num; i++)
{
if (huf[i].parent == 0 && huf[i].weight < min1)
{
min1 = huf[i].weight;
s1 = i;
}
}
for (int i = 1; i <= num; i++)
{
if (i != s1 && huf[i].parent == 0 && huf[i].weight < min2)
{
min2 = huf[i].weight;
s2 = i;
}
}
MIN ans;
ans.s1 = s1;
ans.s2 = s2;
return ans;
}
void number(Tr &Huf, int num)
{
for (int i = num; i >= 1; i--)
{
if (Huf[Huf[i].parent].parent)
{
Huf[i].num = Huf[Huf[i].parent].num + Huf[i].num;
}
}
}
void createTr(Tr &Huf, int num)
{
int m = 2 * num;
m -= 1;
Huf = new Node[m + 1];
for (int i = 1; i <= m; i++)
{
Huf[i].parent = Huf[i].l = Huf[i].r = 0;
}
for (int i = 1; i <= num; i++)
{
cin >> Huf[i].weight;
}
for (int i = 1; i <= num; i++)
{
Huf[i].data = 'a' + i - 1;
}
for (int i = num + 1; i <= m; i++)
{
Min temp;
temp = select(Huf, i - 1);
int s1 = temp.s1;
int s2 = temp.s2;
Huf[s1].parent = i;
Huf[s2].parent = i;
Huf[s1].num = "0";
Huf[s2].num = "1";
// cout << s1 << " " << s2 << endl;
Huf[i].l = temp.s1;
Huf[i].r = temp.s2;
Huf[i].weight = Huf[s1].weight + Huf[s2].weight;
Huf[i].data = -1;
}
number(Huf, m);
}
string changetochar(Tr Huf, string s, int m)
{
string ans;
int pos = 0, first = 0;
while (first < s.size())
{
pos++;
for (int i = 1; i <= m; i++)
{
if (Huf[i].num == s.substr(first, pos))
{
cout << Huf[i].data;
first = first + pos;
pos = 0;
}
}
}
}
void changetonumber(Tr Huf, string s, int num)
{
string ans;
for (int i = 0; i < s.size(); i++)
{
for (int j = 1; j <= num; j++)
{
if (Huf[j].data == s[i])
{
ans = ans + Huf[j].num;
}
}
}
cout << ans;
return;
}
void prt(Tr Huf, int num)
{
for (int i = 1; i <= num; i++)
{
cout << Huf[i].num << endl;
}
}
int main()
{
int num;
cin >> num;
Tr Huf;
createTr(Huf, num);
string a, b;
cin >> a;
cin >> b;
prt(Huf, num);
// cout << a << " " << b;
changetonumber(Huf, a, num);
cout << endl;
changetochar(Huf, b, num);
} /*
8
5 29 7 8 14 23 3 11
aabchg
00011110111111001
*/
被折磨了好久,错误点1 select(Huf,i-1) 错误点2 huf[i].parent==0