Cod sursa(job #696624)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 28 februarie 2012 19:15:44
Problema Coduri Huffman Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include<stdio.h>
#include<queue>
#include<vector>
#define MAX 1000000
#define BUFFsize 1666

using namespace std;

char buff[BUFFsize];
int ind=0;

void read(int &nr)
{
    nr=0;
    while(buff[ind]>='0'&&buff[ind]<='9')
    {
        nr=nr*10+buff[ind]-48;
        ++ind;
        if(ind==BUFFsize)
        {
            fread(buff,1,BUFFsize,stdin);
            ind=0;
        }
    }
    while(buff[ind]<'0'||buff[ind]>'9')
    {
        ++ind;
        if(ind==BUFFsize)
        {
            fread(buff,1,BUFFsize,stdin);
            ind=0;
        }
    }
}

struct nod
{
    int freq,ind;
    vector<nod> childs;
};

struct cmp
{
    bool operator()(const nod &a,const nod &b)
    {
        if(a.freq!=b.freq)return a.freq>b.freq;
        else return a.ind>b.ind;
    }
};

int n,size=0;
priority_queue<nod,vector<nod>,cmp> Q;
int freqs[MAX],nivs[MAX];
long long nrs[MAX];

void expand()
{
    nod n;
    n.childs.push_back(Q.top());
    Q.pop();
    n.childs.push_back(Q.top());
    Q.pop();
    n.freq=n.childs[0].freq+n.childs[1].freq;
    Q.push(n);
}

inline void df(nod n,int niv,long long nr)
{
    if(n.childs.size()>0)
    {
        df(n.childs[0],niv+1,nr*2);
        df(n.childs[1],niv+1,nr*2+1);
    }
    else
    {
        nivs[n.ind]=niv;
        nrs[n.ind]=nr;
    }
}



int main()
{
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    fread(buff,1,BUFFsize,stdin);

    read(n);
    for(int i=0;i<n;++i)
    {
        int x;
        read(x);
        nod n;
        n.freq=x;
		freqs[i]=x;
        n.ind=i;
        Q.push(n);
    }

    while(Q.size()>1)expand();
    df(Q.top(),0,0);

	int s=0;
	for(int i=0;i<n;i++)s+=freqs[i]*nivs[i];
	printf("%d\n",s);

	for(int i=0;i<n;i++)//printf("%s\n",codS[i].c_str());
	{
		printf("%d %I64d\n",nivs[i],nrs[i]);
	}
}