【ssl 1409】【堆】哈夫曼树3
题目
解题思路
统计出每个字母出现的频率作为ta的权值,已经出现的次序这一步恶心到我了
将权值和位置丢进堆中维护
用模板做即可
代码
#include<iostream>
#include<cstdio>
#include<queue>
#include<map>
using namespace std;
struct lzf{
int l,r;
string s;
char c;
}f[3010];
struct node{
int x,w;
}b[30];
int n,t;
string s;
pair<int,int> x,y;
priority_queue <pair<int,int> > p;
void solve(int z)
{
if (!f[z].l&&!f[z].r)
{
cout<<f[z].c<<":"<<f[z].s<<endl;
return;
}
f[f[z].l].s=f[z].s+'0';
solve(f[z].l);
f[f[z].r].s=f[z].s+'1';
solve(f[z].r);
}
int main()
{
cin>>s;
for (int i=0;i<s.size();i++)
{
b[s[i]-65].x++;
if (b[s[i]-65].x==1) b[s[i]-65].w=++n;
}
for (int i=0;i<=25;i++)
if (b[i].x)
{
f[b[i].w].c=i+65;
p.push(make_pair(-b[i].x,-b[i].w));
}
t=n;
for (int i=1;i<n;i++)
{
x=p.top();
p.pop();
y=p.top();
p.pop();
f[++t].l=-x.second;
f[t].r=-y.second;
p.push(make_pair(x.first+y.first,-t));
}
solve(t);
return 0;
}