Cod sursa(job #1096940)

Utilizator misu007Pogonaru Mihai misu007 Data 2 februarie 2014 19:02:59
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.63 kb
#include <cstdio>
#include <queue>
#include <bitset>
using namespace std;

int n,a[1000000];
unsigned long long lg,b[1000000];

struct nod
{
    nod *s,*d;
    int x;
    unsigned long long y;
}*rad;

queue<nod*> q1,q2;

void init()
{
    rad=new nod;
    rad->s='\0';
    rad->d='\0';
}

void read()
{
    freopen("huffman.in","r",stdin);
    scanf("%d",&n);
    for(int i=0;i<n;++i)
    {
        init();
        rad->x=i;
        scanf("%llu",&rad->y);
        q1.push(rad);
    }
}

void creare_arbore()
{
    bitset<1> e;
    nod *n1,*n2,*nou;
    while(!e[0])
    {
        if(!q1.empty()&&!q2.empty())
        {
            if(q2.front()->y<q1.front()->y)
            {
                n1=q2.front();
                q2.pop();
            }
            else
            {
                n1=q1.front();
                q1.pop();
            }
        }
        else
        {
            if(q1.empty())
            {
                n1=q2.front();
                q2.pop();
            }
            else
            {
                n1=q1.front();
                q1.pop();
            }
        }
        if(!q1.empty()&&!q2.empty())
        {
            if(q2.front()->y<q1.front()->y)
            {
                n2=q2.front();
                q2.pop();
            }
            else
            {
                n2=q1.front();
                q1.pop();
            }
        }
        else
        {
            if(q1.empty())
            {
                if(q2.empty()) e[0]=1;
                else
                {
                    n2=q2.front();
                    q2.pop();
                }
            }
            else
            {
                n2=q1.front();
                q1.pop();
            }
        }
        if(e[0]) rad=n1;
        else
        {
            nou=new nod;
            nou->s=n1;
            nou->d=n2;
            nou->x=-1;
            nou->y=n1->y+n2->y;
            lg+=nou->y;
            q2.push(nou);
        }
    }
}

void codare(nod *nd,int x,bitset<60> b1)
{
    if(nd->x!=-1)
    {
        a[nd->x]=x;
        b[nd->x]=b1.to_ullong();
    }
    else
    {
        b1<<=1;
        codare(nd->s,x+1,b1);
        b1[0]=1;
        codare(nd->d,x+1,b1);
    }
}

void huffman()
{
    creare_arbore();
    bitset<60> b1;
    codare(rad,0,b1);
}

void write()
{
    freopen("huffman.out","w",stdout);
    printf("%llu\n",lg);
    for(int i=0;i<n;++i)
    {
        printf("%d %llu\n",a[i],b[i]);
    }
}

int main()
{
    read();
    huffman();
    write();
    return 0;
}