Cod sursa(job #386011)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 23 ianuarie 2010 21:57:17
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>
#include <iostream>
#include <cstring>

#define v 1000005

using namespace std;

ifstream fin ("huffman.in");
ofstream fout ("huffman.out");

struct nod
{
    int val;
    nod *st, *dr;
};

nod *a[v], *q[v];
int n, c[v], f[v], x[v], lg=0;

void citire()
{
    fin >> n;
    memset(a,0,sizeof(a));
    int x;
    for (int i=0; i<n; i++)
    {
        fin >> x;
        a[i]=new nod;
        a[i]->val=x;
        a[i]->st=a[i]->dr=0;
    }
}

int huffman()
{
    memset(q,0,sizeof(q));
    int w,d,s;
    nod *m1, *m2;
    for (d=w=0, s=-1; w<n ||  d<s;)
    {
        m1=a[w],m2=a[w+1], w+=2;
        if (q[d] && (!m1 || q[d]->val<m1->val))
        {
            m2=m1, m1=q[d], w--, ++d;
            if (q[d] && (!m2 || q[d]->val<m2->val))
                m2=q[d], --w, ++d;
        }
        else if (q[d] && (!m2 || q[d]->val<m2->val))
            m2=q[d], --w, ++d;
        q[++s]=new nod;
        q[s]->val=m1->val+m2->val;
        q[s]->st=m1;
        q[s]->dr=m2;
    }
    return s;
}

void coduri(nod *s, int niv)
{
    if (s->st==s->dr && s->st==0)
    {
        f[++f[0]]=niv;
        for (int i=niv, j=1; i>=0; i--, j*=2)
            x[f[0]]+=c[i]*j;
    }
    else
    {
        lg+=s->val;
        c[niv+1]=0;
        coduri(s->st,niv+1);
        c[niv+1]=1;
        coduri(s->dr,niv+1);
    }
}

void sortare(int l, int r)
{
    int i,j,aux,mij;
    i=l, j=r;
    mij=f[(l+r)/2];
    do
    {
        while (f[i]<mij)
            ++i;
        while (f[j]>mij)
            --j;
        if (i<=j)
            aux=f[i];
            f[i]=f[j];
            f[j]=aux;
            aux=x[i];
            x[i]=x[j];
            x[j]=aux;
            ++i;
            --j;
    }
    while (i<=j);
    if (l<j) sortare (l,j);
    if (i<r) sortare (i,r);
}

int main()
{
    citire();
    //huffman();
    coduri(q[huffman()],0);
    sortare(1, f[0]);
    fout << lg;
    for (int i=f[0]; i; i--)
        fout << f[i] << " " << x[i] << "\n";
    return 0;
}