Cod sursa(job #2077613)

Utilizator AlexGAlexandru Gheorghe AlexG Data 28 noiembrie 2017 12:28:08
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <fstream>
#include <climits>

using namespace std;

const long numarMaximSimboluri = 1000001;
struct Nod
{
    long long numarAparitii;
    long fiu[2];
} nod[2 * numarMaximSimboluri];

long numarSimboluri, inceput[2], sfarsit[2];
long coada[2][numarMaximSimboluri], lungimeCod[numarMaximSimboluri];
long long reprezentareZecimalaCod[numarMaximSimboluri], lungimeMinimaText;

void parcurgereInAdancime(long i, long long cod, long adancime)
{
    if(nod[i].fiu[0] != 0)
    {
        parcurgereInAdancime(nod[i].fiu[0], cod*2, adancime+1);
        parcurgereInAdancime(nod[i].fiu[1], cod*2+1, adancime+1);
        return;
    }
    lungimeCod[i] = adancime;
    reprezentareZecimalaCod[i] = cod;
}

const long long infinit = LONG_LONG_MAX;
long numarNoduri;
void construiesteNoduriInterne()
{
    inceput[0]=inceput[1]=1;
    sfarsit[0]=numarSimboluri;
    while(inceput[0]+inceput[1]<=sfarsit[0]+sfarsit[1])
    {
        for(int j=0; j<2; j++)
        {
            int coadaCuNodMinim=0;
            long long numarMinimAparitii = infinit;
            for(int i=0; i<2; i++)
            {
                if(nod[coada[i][inceput[i]]].numarAparitii < numarMinimAparitii && inceput[i]<=sfarsit[i])
                {
                    coadaCuNodMinim = i;
                    numarMinimAparitii = nod[coada[i][inceput[i]]].numarAparitii;
                }
            }
            nod[numarNoduri].fiu[j]=coada[coadaCuNodMinim][inceput[coadaCuNodMinim]];
            nod[numarNoduri].numarAparitii+=nod[coada[coadaCuNodMinim][inceput[coadaCuNodMinim]]].numarAparitii;
            inceput[coadaCuNodMinim]++;
        }
        lungimeMinimaText+=nod[numarNoduri].numarAparitii;
        coada[1][++sfarsit[1]]=numarNoduri++;
    }
}

int main()
{
    ifstream fin("huffman.in");
    fin>>numarSimboluri;
    for(int i=1; i<=numarSimboluri; i++)
    {
        fin >> nod[i].numarAparitii;
        coada[0][i]=i;
    }
    numarNoduri = numarSimboluri+1;
    construiesteNoduriInterne();
    parcurgereInAdancime(numarNoduri-1, 0, 0);
    ofstream fout("huffman.out");
    fout << lungimeMinimaText << '\n';
    for(int i=1; i<=numarSimboluri; i++)
        fout << lungimeCod[i] << ' ' << reprezentareZecimalaCod[i] << '\n';
    return 0;
}