Cod sursa(job #796738)

Utilizator radustn92Radu Stancu radustn92 Data 12 octombrie 2012 13:21:10
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>
#define NMAX 1000005
#define LMAX 2000005
#define DIM (1<<16)
#define ll long long
int n,A[NMAX],B[NMAX],r,p1,p2,poz[NMAX],t,l;
int st[LMAX],dr[LMAX];
char L[LMAX],buff[DIM];
ll val[LMAX],C[LMAX],rez;
inline int check(int x,int y)
{
	if (x==n+1)
		return 0;
	if (y==r+1)
		return 1;
	return A[x]<C[B[y]];
}
inline int read()
{
	int x=0;
	while (buff[l]<'0' || buff[l]>'9')
		if (++l==DIM)
			fread(buff,1,DIM,stdin),l=0;
	while (buff[l]>='0' && buff[l]<='9')
	{
		x=x*10+buff[l]-'0';
		if (++l==DIM)
			fread(buff,1,DIM,stdin),l=0;
	}
	return x;
}
int main()
{
	freopen("huffman.in","r",stdin);
	freopen("huffman.out","w",stdout);
	n=read();
	int i,nod1,nod2;
	for (i=1; i<=n; i++)
		A[i]=read();
	
	while (p1<n || p2<r)
	{
		if (check(p1+1,p2+1))
			C[++t]=A[++p1],poz[p1]=t,nod1=t;
		else
			nod1=B[++p2];
		
		if (check(p1+1,p2+1))
			C[++t]=A[++p1],poz[p1]=t,nod2=t;
		else
			nod2=B[++p2];
			
		C[++t]=C[nod1]+C[nod2];
		st[t]=nod1; dr[t]=nod2;
		B[++r]=t;
		
		if (p1==n && r-p2==1)
			break ;
	}
	
	for (i=t; i>=1; i--)
		if (st[i] && dr[i])
		{
			L[st[i]]=L[dr[i]]=L[i]+1; 
			val[st[i]]=val[i]*2;
			val[dr[i]]=val[i]*2+1;
			
			rez+=C[i];
		}
		
	printf("%lld\n",rez);
	for (i=1; i<=n; i++)
		printf("%d %lld\n",L[poz[i]],val[poz[i]]);
	return 0;
}