Cod sursa(job #1037492)

Utilizator misu007Pogonaru Mihai misu007 Data 20 noiembrie 2013 12:07:52
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.83 kb
#include <cstdio>
#include <queue>
#include <bitset>
using namespace std;

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

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

queue<nod*> q1,q2;
bitset<60> b[100000];

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

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

void creare_arbore()
{
    char e=0;
    nod *n1,*n2,*nou;
    while(!e)
    {
        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=1;
                else
                {
                    n2=q2.front();
                    q2.pop();
                }
            }
            else
            {
                n2=q1.front();
                q1.pop();
            }
        }
        if(e) 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;
    }
    else
    {
        codare(nd->s,x+1,b1);
        b1[x]=1;
        codare(nd->d,x+1,b1);
    }
}

void huffman()
{
    creare_arbore();
    bitset<60> b1;
    codare(rad,0,b1);
    //codare(h[0]->d,1);
}

unsigned long long b2(int i)
{
    unsigned long long r=0,p=1;
    for(int j=a[i]-1;j>=0;++j)
    {
        if(b[i][j]) r+=p;
        p*=2;
    }
    return r;
}

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

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