Cod sursa(job #900674)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 28 februarie 2013 21:10:47
Problema Coduri Huffman Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include<cstdio>
#include<queue>
#define INF 1000005
#define buffSize 205255

using namespace std;

char buff[buffSize];
int ind=0;

void read(int &nr)
{
    nr=0;
    while(buff[ind]<'0'||buff[ind]>'9')
    {
        ++ind;
        if(ind==buffSize){fread(buff,1,buffSize,stdin);ind=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;}
    }
}

struct nod
{
    int f,ind;
    nod *st,*dr;

};

struct cmp
{
    bool operator()(const nod* n1,const nod* n2)
    {
        return n1->f>n2->f;
    }
};

priority_queue<nod*, vector<nod*>,cmp > Q;
int n,freq[INF];
unsigned long long lg=0,ras[INF][2];

void df(nod *nd,int nr,int level)
{
    if(nd==NULL)return;
    if(nd->ind!=-1)
    {
        ras[nd->ind][0]=level;
        ras[nd->ind][1]=nr;
        lg+=freq[nd->ind]*level;
        return;
    }
    df(nd->st,nr*2,level+1);
    df(nd->dr,nr*2+1,level+1);
}

int main()
{
    freopen("huffman.in","r",stdin);
    freopen("huffman.out","w",stdout);
    //scanf("%d",&n);
    fread(buff,1,buffSize,stdin);
    read(n);
    for(int i=0;i<n;++i)
    {
        //scanf("%d",&freq[i]);
        read(freq[i]);
        nod *nd=new nod;
        nd->f=freq[i];nd->ind=i;
        Q.push(nd);
    }
    while(Q.size()>1)
    {
        nod *nd1=Q.top();
        Q.pop();
        nod *nd2=Q.top();
        Q.pop();
        nod *nd3=new nod;
        nd3->ind=-1;
        nd3->f=nd1->f+nd2->f;
        if(nd1->f<nd2->f)
        {
            nd3->st=nd1;
            nd3->dr=nd2;
        }
        else
        {
            nd3->st=nd2;
            nd3->dr=nd1;
        }
        Q.push(nd3);
    }
    df(Q.top(),0,0);
    printf("%lld\n",lg);
    for(int i=0;i<n;++i)
    printf("%lld %lld\n",ras[i][0],ras[i][1]);

    return 0;
}