Pagini recente » Cod sursa (job #1539195) | Cod sursa (job #114635) | Cod sursa (job #81438) | Cod sursa (job #1042932) | Cod sursa (job #1982332)
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int n;
long long lg;
int fromBinaryToDecimal(vector<int>binary)
{
int rez=0,p=0;
for(int i=binary.size()-1; i>=0; i--,p++)
{
rez+=(binary[i]<<p);
}
return rez;
}
pair<int,long long> sol[1000002];
vector<int>binaryNR;
class arboreBinar
{
private:
public:
arboreBinar* left;
arboreBinar* right;
long long frequency;
int idx;
arboreBinar(long long freq,arboreBinar*lChild,arboreBinar*rChild,int inIndex)
{
this->frequency=freq;
this->idx=inIndex;
this->left=lChild;
this->right=rChild;
}
void printCodifiedObjects(arboreBinar*node,int niv)
{
if(node->left==NULL&&node->right==NULL)
{
sol[node->idx]=make_pair(niv,fromBinaryToDecimal(binaryNR));
return;
}
if(node->left!=NULL)
{
binaryNR.push_back(0);
printCodifiedObjects(node->left,niv+1);
binaryNR.pop_back();
}
if(node->right!=NULL)
{
binaryNR.push_back(1);
printCodifiedObjects(node->right,niv+1);
binaryNR.pop_back();
}
}
};
queue <arboreBinar*> valInit;
queue <arboreBinar*> valRez;
void citire()
{
scanf("%d",&n);
long long aux;
for(int i=0; i<n; i++)
{
scanf("%lld",&aux);
valInit.push(new arboreBinar(aux,NULL,NULL,i+1));
}
}
arboreBinar*root;
void buildArb()
{
while(!valInit.empty())
{
arboreBinar*left;
arboreBinar*right;
if(!valInit.empty()&&valInit.front()->frequency<=valRez.front()->frequency)
{
left=valInit.front();
valInit.pop();
}
else
{
left=valRez.front();
valRez.pop();
}
if(!valInit.empty()&&valInit.front()->frequency<=valRez.front()->frequency)
{
right=valInit.front();
valInit.pop();
}
else
{
right=valRez.front();
valRez.pop();
}
root=new arboreBinar(left->frequency+right->frequency,left,right,0);
lg+=root->frequency;
valRez.push(root);
}
while(valRez.size()>1)
{
arboreBinar*left;
arboreBinar*right;
left=valRez.front();
valRez.pop();
right=valRez.front();
valRez.pop();
root=new arboreBinar(left->frequency+right->frequency,left,right,0);
lg+=root->frequency;
valRez.push(root);
}
}
int main()
{
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
citire();
buildArb();
printf("%lld\n",lg);
root->printCodifiedObjects(root,0);
for(int i=1; i<=n; i++)
{
printf("%d %lld\n",sol[i].first,sol[i].second);
}
return 0;
}