Cod sursa(job #1105766)

Utilizator raulstoinStoin Raul raulstoin Data 12 februarie 2014 08:01:27
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<fstream>

#define NMAX 1000005

using namespace std;

ifstream fin("huffman.in");
ofstream fout("huffman.out");

int n,Q1[NMAX],Q2[NMAX],Level[NMAX],L1=1,L2=1,F[2*NMAX],Son[NMAX][2],nr,sol;
long long Cod[NMAX];

int pop()
{
	if(F[Q1[L1]]<F[Q2[L2]])
		return Q1[L1++];
	return Q2[L2++];
}

void DFS(int nod,int Niv,long long C)
{
	if(Son[nod][0])
	{
		DFS(Son[nod][0],Niv+1,(C<<1));
		DFS(Son[nod][1],Niv+1,(C<<1)+1);
	}
	Level[nod]=Niv;
	Cod[nod]=C;
}

int main()
{
	fin>>n;
	for(int i=1;i<=n;i++)
	{
		fin>>F[i];
		Q1[i]=i;
	}
	Q1[0]=n;
	F[0]=(1<<30);
	nr=n;
	for(int a,b;L1<=Q1[0] || L2<Q2[0];)
	{
		a=pop();
		b=pop();
		F[++nr]=F[a]+F[b];
		sol+=F[nr];
		Son[nr][0]=a;
		Son[nr][1]=b;
		Q2[++Q2[0]]=nr;
	}
	fout<<sol<<'\n';
	DFS(nr,0,0);
	for(int i=1;i<=n;i++)
		fout<<Level[i]<<' '<<Cod[i]<<'\n';
	return 0;
}