时间限制: 1 Sec 内存限制: 128 MB
题目描述
相信大家都对哈夫曼编码有所了解,通常利用哈夫曼编码来压缩数据。现在给你一个字符串,你需要统计其中字符出现的次数然后以出现次数为权值构建一棵哈夫曼树,例如字符串为ABBCCC,其中一种可能的编码是A = 00,B = 01,C = 1,那么这个字符串所对应的哈夫曼编码就是000101111,你的任务是求出字符串最终形成的哈夫曼编码的长度。
输入
一行由大写字母组成的字符串,且字符串长度不超过10000,该字符串最少包含一种字符。
输出
字符串的哈夫曼编码长度。
样例输入
ABBCCC
样例输出
9
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const long long int INF=1e9+7;
const ll MAX=110000;
ll n;
ll a[MAX];
string x;
map<char,ll> mp;
int main(){
priority_queue<ll,vector<ll>,greater<ll> >que;
set<char> st;
cin>>x;
n=x.length();
for(ll i=0;i<n;i++){
mp[x[i]]++;
st.insert(x[i]);
}
n=st.size();
multiset<char>::iterator it;
int ii;
for(it=st.begin(),ii=0;ii<n;ii++,it++){
a[ii]=mp[*it];
que.push(a[ii]);
}
ll ans=0;
for(ll i=0;i<n-1;i++){
ll a=que.top();
que.pop();
ll b=que.top();
que.pop();
ll t=a+b;
ans+=t;
que.push(t);
}
cout<<ans<<endl;
return 0;
}