Cod sursa(job #2767875)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 8 august 2021 13:29:58
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>
#include <queue>

using namespace std;

const int NMAX = 1000000;
int sol[1 + NMAX];

struct Nod
{
    int frecv;
    bool frunza;
    int id;

    Nod* fiuSt;
    Nod* fiuDr;

    Nod() {};

    Nod(int frecv, bool frunza, int id) :
        frecv(frecv), frunza(frunza), id(id) {};
};

queue<Nod*> q1;
queue<Nod*> q2;

Nod* nextNod()
{
    Nod* nod;

    if (q1.empty())
    {
        nod = q2.front();
        q2.pop();
        return nod;
    }
    else if (q2.empty())
    {
        nod = q1.front();
        q1.pop();
        return nod;
    }
    else
    {
        if (q1.front()->frecv < q2.front()->frecv)
        {
            nod = q1.front();
            q1.pop();
            return nod;
        }
        else
        {
            nod = q2.front();
            q2.pop();
            return nod;
        }
    }
}

int dfs(Nod* nod, int adancime, int val)
{
    if (nod->frunza)
    {
        sol[nod->id] = val;
        return 0;
    }

    int suma = 0;

    suma += dfs(nod->fiuSt, adancime + 1, val);

    suma += dfs(nod->fiuDr, adancime + 1, val |= (1 << adancime));

    return suma + nod->frecv;
}

int dimensiune(int val)
{
    if (val == 0)
        return 1;

    int i;
    for (i = 0; i < 32 && val > 0; i++)
    {
        if (val & (1 << i))
            val -= (1 << i);
    }

    return i;
}

int main()
{
    ifstream in("huffmann.in");
    ofstream out("huffmann.out");

    int n;
    in >> n;

    for (int i = 1; i <= n; i++)
    {
        int v;
        in >> v;

        q1.push(new Nod(v, true, i));
    }

    while (q1.size() + q2.size() >= 2)
    {
        Nod* nod1 = nextNod();
        Nod* nod2 = nextNod();

        Nod* tata = new Nod(nod1->frecv + nod2->frecv, false, -1);
        q2.push(tata);

        tata->fiuSt = nod1;
        tata->fiuDr = nod2;
    }

    Nod* radacina = q2.front();

    out << dfs(radacina, 0, 0) << '\n';

    for (int i = 1; i <= n; i++)
    {
        out << dimensiune(sol[i]) << ' ' << sol[i] << '\n';
    }

    return 0;
}