Cod sursa(job #1105787)

Utilizator raulstoinStoin Raul raulstoin Data 12 februarie 2014 08:58:06
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include<fstream>
#include<cstring>

#define NMAX 1000005

using namespace std;

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

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

const int SZ=8192;
char buffer[SZ+1],*in,output[SZ+1],*out,snr[50];

inline int atoi()
{
	int nr=0;
	for(;*in && *in<'0';in++);
	if(in==buffer+SZ)
	{
		fin.read(buffer,SZ);
		in=buffer;
	}
	for(;*in>='0';in++)
	{
		nr=nr*10+(*in-'0');
		if(in+1==buffer+SZ)
		{
			fin.read(buffer,SZ);
			in=buffer-1;
		}
	}
	return nr;
}

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

inline 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;
}

inline void itos(long long x,bool sw)
{
	if(!x)
	{
		if(sw)
			*out++='0';
		return;
	}
	itos(x/10,sw);
	*out++=x%10+'0';
}

void print()
{
	fout<<sol<<'\n';
	int ind=0;
	for(int i=1;i<=n;i++)
	{
		memset(snr,0,sizeof snr);
		out=snr;
		itos(Level[i],Level[i]==0);
		*out++=' ';
		itos(Cod[i],Cod[i]==0);
		*out++='\n';
		for(int j=0;snr[j];j++)
		{
			output[ind]=snr[j];
			if(ind==SZ-1)
			{
				fout<<output;
				ind=-1;
			}
			output[++ind]=0;
		}
	}
	fout<<output;
}

int main()
{
	fin>>n;
	fin.read(buffer,SZ);
	in=buffer;
	for(int i=1;i<=n;i++)
	{
		F[i]=atoi();
		Q1[i]=i;
	}
	F[0]=(1LL<<60);
	nr=n;
	for(int a,b;L1<=n || 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;
	}
	DFS(nr,0,0);
	print();
	return 0;
}