Cod sursa(job #742511)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 30 aprilie 2012 15:34:14
Problema Coduri Huffman Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;

#define U long long
#define NM 2000000

U frecventa[NM],reprezentare[NM],lung = 0;
int dep[NM],leftSon[NM],rightSon[NM],N,nInit;
queue <int> q1,q2;
inline void readInputData()
{
    cin>>nInit;
    N = nInit;
    U aux;
    for (U i=1; i<=nInit; ++i)
    {
        cin>>frecventa[i];
        //ind[i]=i;
        q1.push(i);
    }
    fclose(stdin);
}

inline void update( int &p1, int &p2)
{
    ++N;
    frecventa[N] = frecventa[ p1 ] + frecventa[ p2 ];
    leftSon[N] = p1;
    rightSon[N] = p2;
    //ind[N]=N;
    if (q1.empty() && q2.empty() )
        return;
    q2.push(N);
}

inline void verific(queue<int> &q, int &poz1,int &poz2)
{
    poz1=q.front();
    q.pop();
    poz2=q.front();
    q.pop();
    update(poz1,poz2);
}

inline void capete ( int &p)
{
    if (frecventa[q1.front()] < frecventa[ q2.front()])
    {
        p = q1.front();
        q1.pop();
        return;
    }
    p = q2.front();
    q2.pop();
}

inline void solveHuffman()
{
    int poz1,poz2;
    while ( !q1.empty () || !q2.empty() )
    {
        if (q1.empty())
        {
            verific(q2,poz1,poz2);
            continue;
        }

        if (q2.empty())
        {
            verific(q1,poz1,poz2);
            continue;
        }

        capete(poz1);

        if (q1.empty())
        {
            poz2 = q2.front();
            q2.pop();
            update(poz1,poz2);
            continue;
        }

        if (q2.empty())
        {
            poz2 = q1.front();
            q1.pop();
            update(poz1,poz2);
            continue;
        }
        capete(poz2);
        update(poz1,poz2);
    }
}

void df(int nod, U cod,int nivel)
{
    if (nod !=N )
        lung += frecventa[nod];

    //funza
    if (nod <= nInit)
    {
        dep[nod] = nivel;
        reprezentare[nod] = cod;
        return;
    }

    df(leftSon[nod],(cod<<1) +1,nivel+1);
    df(rightSon[nod],(cod<<1) ,nivel+1);
}

inline void afis()
{
    freopen ("huffman.out","w",stdout);
    cout<<lung<<"\n";
    for (int i=1; i<=nInit; ++i)
        cout<<dep[i]<<" "<<reprezentare[i]<<"\n";
    fclose(stdout);
}
int main()
{
    freopen ("huffman.in","r",stdin);
    readInputData();
    solveHuffman();
    df(N,0,0);
    afis();
    return 0;
}