Cod sursa(job #550749)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 9 martie 2011 21:33:41
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
# include <fstream>
# define inf 1LL*1000000000*1000000000
using namespace std;
ifstream f ("huffman.in");
ofstream g ("huffman.out");
long long int lb[1000005],lg,k,y,x;
int l[1000005],n,vf,i,j,z;

struct nod 
{
	long long int ap;
	int st,dr;
}*p,*v,*q,a[2000005];

class coada
{
	int pr,ul;
	nod *c[1000005];
public:
	coada (){pr=1;ul=0;}
	void push (nod *p);
	void pop (long long int &y,int &x);
	long long int appr ();

}c1,c2;


	void coada::push (nod *p)
	{
		ul++;
		c[ul]=p;
	}
	
	void coada::pop (long long int &y,int &x)
	{
		y=c[pr]->ap;
		x=pr;
		pr++;
	}
	
	inline long long int coada::appr ()
	{
		if (pr<=ul)
		return c[pr]->ap;
		else
			return inf;
	}
	
	
	
	void df (int k)
	{
		vf++;
		
		if (a[k].st)
		{	
			
			x<<=1;
			df (a[k].st);
		}
		if (a[k].dr)
		{	
		
			x<<=1;
			x+=1;
			df (a[k].dr);
		}
		if (a[k].st==0 && a[k].dr==0)
		{
			l[k]=vf-1;
			lb[k]=x;
			
		}
		else
			lg+=a[k].ap;
		vf--;
		x>>=1;
		
	}
		
	
	
int main ()
{
	
	f>>n;
	for (i=1;i<=n;i++)
	{
		f>>x;
		a[i].ap=x;
		a[i].st=0;
		a[i].dr=0;
		p=&a[i];
		c1.push (p);
	}
	k=n;
	for (i=1;i<n;i++)
	{
		k++;
		
		a[k].ap=0;
		for (j=1;j<=2;j++)
		if (c1.appr()<c2.appr())
		{
			c1.pop (y,z);
			if (j==1)
			a[k].st=z;
			else
				a[k].dr=z;
			a[k].ap+=y;
		}
		else
		{
			c2.pop (y,z);
			if (j==1)
			a[k].st=z+n;
			else
				a[k].dr=z+n;
			a[k].ap+=y;
		}
		
		
		c2.push (&a[k]);
	}
	
	v=p;
	x=0;
	df (k);
	g<<lg<<"\n";
	for (i=1;i<=n;i++)
	g<<l[i]<<" "<<lb[i]<<"\n";
	return 0;
}