Pagini recente » Cod sursa (job #2363788) | Cod sursa (job #2381032) | Cod sursa (job #2623367) | Cod sursa (job #777526) | Cod sursa (job #696141)
Cod sursa(job #696141)
#include<stdio.h>
#include<queue>
#include<vector>
#include<string>
using namespace std;
struct nod
{
int freq,ind;
vector<nod> childs;
};
struct cmp
{
bool operator()(const nod &a,const nod &b)
{
return a.freq>b.freq;
}
};
int n,size=0;
priority_queue<nod,vector<nod>,cmp> Q;
string codS[10000];
int freqs[100000];
void expand()
{
nod n;
n.childs.push_back(Q.top());
Q.pop();
n.childs.push_back(Q.top());
Q.pop();
n.freq=n.childs[0].freq+n.childs[1].freq;
Q.push(n);
}
void df(nod n,string s)
{
if(n.childs.size()>0)
{
df(n.childs[0],s+'0');
df(n.childs[1],s+'1');
}
else codS[n.ind]=s;
}
int strToInt(string s)
{
int ret=0;
int pow=1;
for(int i=0;i<s.length();i++)
{
ret+=(s[i]-48)*pow;
pow*=2;
}
return ret;
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%d\n",&n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d\n",&x);
nod n;
n.freq=x;
freqs[i]=x;
n.ind=i;
Q.push(n);
}
while(Q.size()>1)expand();
df(Q.top(),"");
int s;
for(int i=0;i<n;i++)s+=freqs[i]*codS[i].length();
printf("%d\n",s);
for(int i=0;i<n;i++)//printf("%s\n",codS[i].c_str());
{
printf("%d %d\n",codS[i].length(),strToInt(codS[i]));
}
}