Cod sursa(job #2888437)

Utilizator DariaClemClem Daria DariaClem Data 11 aprilie 2022 02:27:26
Problema Coduri Huffman Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.26 kb
#include <bits/stdc++.h>

using namespace std;

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

struct nod {
    unsigned long frecventa;
    nod *dreapta;
    nod *stanga;
};

queue<nod *> initial, intern;
vector<vector<unsigned long>> rezultat(1000000);
unsigned long nrElemente;

nod *furnizare() {
    nod *val;
    if (initial.empty()) {
        val = intern.front();
        intern.pop();
        return val;
    } else if (intern.empty()) {
        val = initial.front();
        initial.pop();
        return val;
    } else if (initial.front()->frecventa < intern.front()->frecventa) {
        val = initial.front();
        initial.pop();
        return val;
    } else {
        val = intern.front();
        intern.pop();
        return val;
    }
}

void configurare(nod *&curent, unsigned long reprezentare, unsigned long nivel) {
    if (curent->dreapta != NULL) {
        configurare(curent->stanga, reprezentare << 1, nivel + 1);
    }
    if (curent->stanga != NULL) {
        configurare(curent->dreapta, (reprezentare << 1) | 1, nivel + 1);
    }
    if (curent->stanga == NULL)
        rezultat[nivel].push_back(reprezentare);
}

void sterge(nod *n) {
    if (n) {
        sterge(n->dreapta);
        sterge(n->stanga);
        delete n;
    }
}

int main() {
    unsigned long index, valoare, suma = 0, i;
    fin >> nrElemente;
    for (index = 0; index < nrElemente; index += 1) {
        fin >> valoare;
        nod *nod1 = new nod;
        nod1->stanga = NULL;
        nod1->dreapta = NULL;
        nod1->frecventa = valoare;
        initial.push(nod1);
    }
    while (initial.size() > 1 or intern.size() > 1) {
        nrElemente += 1;
        nod *nodParinte = new nod;
        nodParinte->dreapta = furnizare();
        nodParinte->stanga = furnizare();
        nodParinte->frecventa = nodParinte->dreapta->frecventa + nodParinte->stanga->frecventa;
        intern.push(nodParinte);
        suma += nodParinte->frecventa;
    }
    fout << suma << "\n";
    configurare(intern.front(), 0, 0);
    sterge(intern.front());
    for (index = rezultat.size() - 1; index >= 1; index -= 1) {
        for (i = 0; i < rezultat[index].size(); i += 1) {
            fout << index << " " << rezultat[index][i] << "\n";
        }
        rezultat[index].clear();
    }

    return 0;
}