Cod sursa(job #549707)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 8 martie 2011 21:20:37
Problema Coduri Huffman Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
# include <fstream>
# define inf 1000000000
using namespace std;
ifstream f ("huffman.in");
ofstream g ("huffman.out");
long long int lb[1000005],l[1000005],n,lg,vf,ff,x,i,j;
bool s[1000005];

struct nod 
{
	long long int info,ap;
	nod *st,*dr;
}*p,*v,*q;

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

}c1,c2;


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