Cod sursa(job #1134141)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 6 martie 2014 03:38:48
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <vector>
using namespace std;

const int MAX_N = 1000002;
const int SIGMA = 2;

struct Node {
    int ind;
    int sons[SIGMA];
    long long val;

    Node() {
        val = ind = 0;
        for(int i = 0; i < SIGMA; ++i)
            sons[i] = 0;
    }
};

int N;
int frequency[MAX_N];
vector < int > a, b;
long long ans;
pair < int, long long > sol[MAX_N];
Node v[2 * MAX_N];

void DFS(Node node, long long code, int lv) {
    for(size_t i = 0; i < SIGMA; ++i)
        if(node.sons[i])
            DFS(v[node.sons[i]], code * 2 + i, lv + 1);
    if(node.ind <= N) {
        sol[node.ind] = make_pair(lv, code);
        ans += (long long) lv * frequency[node.ind];
    }
}

inline int getMin(int &p_a, int &p_b) {
    if(p_a >= a.size())
        return b[p_b++];
    else if(p_b >= b.size())
        return a[p_a++];
    else if(v[a[p_a]].val < v[b[p_b]].val)
        return a[p_a++];
    else
        return b[p_b++];
}

int main() {
    ifstream f("huffman.in");
    ofstream g("huffman.out");

    f >> N;
    Node temp;
    for(int i = 1; i <= N; ++i) {
        f >> frequency[i];

        temp.val = frequency[i];
        temp.ind = i;
        v[i] = temp;
        a.push_back(i);
    }

    int p = N + 1;
    Node node, temp1, temp2;
    for(int i = 0, j = 0; i < a.size() || j < b.size() - 1; ) {
        temp1 = v[getMin(i, j)];
        temp2 = v[getMin(i, j)];

        node.val = temp1.val + temp2.val;
        node.ind = p;
        node.sons[0] = temp1.ind, node.sons[1] = temp2.ind;
        v[p] = node;
        ++p;

        b.push_back(node.ind);
    }

    DFS(node, 0, 0);

    g << ans << "\n";
    for(int i = 1; i <= N; ++i)
        g << sol[i].first << " " << sol[i].second << "\n";

    f.close();
    g.close();

    return 0;
}