Cod sursa(job #383760)

Utilizator GotenAmza Catalin Goten Data 17 ianuarie 2010 22:48:37
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include<fstream.h>

int k,n,i,a[1000100],lim,p1,p2,u1,u2,c[1000100],j,niv[2000100],h[1000100],wb[2000100][2];
long long w[2000100],b[2000100],lg;


void dfsn(int nod, int nivel)
{
	niv[nod]=nivel;
	if(wb[nod][0])
	{
		dfsn(wb[nod][0],nivel+1);
		dfsn(wb[nod][1],nivel+1);
	}
}
	
void dfsb(int nod, int bob)
{
	if(!wb[nod][1])
		b[nod]=bob<<1;
	else
		dfsb(wb[nod][1],bob<<1);
	if(!wb[nod][0])
		b[nod]=(bob<<1)+1;
	else
		dfsb(wb[nod][0],(bob<<1)+1);
}

int main()
{
	ifstream f("huffman.in");
	ofstream g("huffman.out");
	f>>n;
	for(i=1;i<=n;i++)
		f>>a[i];
	k=0;
	lim=2*n-1;
	p1=1;
	u1=n;
	p2=1;
	u2=0;
	while(k<lim)
	{
		if(a[p1+1]&&(a[p1+1]<=w[c[p2]]||p2>u2))
		{
			w[++k]=a[p1];
			h[p1]=k;
			wb[k][0]=0;
			wb[k][1]=0;
			w[++k]=a[p1+1];
			h[p1+1]=k;
			wb[k][0]=0;
			wb[k][1]=0;
			w[++k]=a[p1]+a[p1+1];
			c[++u2]=k;
			wb[k][0]=k-1;
			wb[k][1]=k-2;
			p1+=2;
		}
		else
			if(w[c[p2+1]]&&(w[c[p2+1]]<=a[p1]||p1>u1))
			{
				w[++k]=w[c[p2]]+w[c[p2+1]];
				c[++u2]=k;
				wb[k][0]=c[p2+1];
				wb[k][1]=c[p2];
				p2+=2;
			}
			else 
				if(p1<=u1&&p2<=u2&&w[c[p2]]<=a[p1]&&(a[p1]<=w[c[p2+1]]||p2==u2))
				{
					w[++k]=a[p1];
					h[p1]=k;
					wb[k][0]=0;
					wb[k][1]=0;
					w[++k]=a[p1]+w[c[p2]];
					c[++u2]=k;
					wb[k][0]=k-1;
					wb[k][1]=c[p2];
					p1++;
					p2++;
				}
				else
					if(p1<=u1&&p2<=u2&&a[p1]<=w[c[p2]]&&(w[c[p2]]<=a[p1+1]||p1==u1))
					{
						w[++k]=a[p1];
						h[p1]=k;
						wb[k][0]=0;
						wb[k][1]=0;
						w[++k]=a[p1]+w[c[p2]];
						c[++u2]=k;
						wb[k][0]=c[p2];
						wb[k][1]=k-1;
						p1++;
						p2++;
					}
	}
	dfsn(lim,0);
	for(i=1;i<lim;i++)
			lg+=w[i];
	g<<lg<<'\n';
	dfsb(lim,0);
	for(i=1;i<=n;i++)
		g<<niv[h[i]]<<' '<<b[h[i]]<<'\n';
	return 0;
}