Pagini recente » Cod sursa (job #2722583) | Cod sursa (job #1353457) | Cod sursa (job #3221535) | Cod sursa (job #2297505) | Cod sursa (job #2687279)
#include <iostream>
#include <fstream>
#include <queue>
#include <set>
#include <algorithm>
#include <stack>
#include <vector>
#include <iomanip>
#include <cstdio>
using namespace std;
ifstream fin("huffman.in");
ofstream fout("huffman.out");
long long v[2000005];
queue<int> init, intern;
int n, nr;
long long s;
int mu[2000005][2];
long long rez[1000005];
int lung[1000005];
long long getMin() {
int ret = 0;
if (!init.empty() && (intern.empty() || v[init.front()] <= v[intern.front()])) {
ret = init.front();
init.pop();
return ret;
}
ret = intern.front();
intern.pop();
return ret;
}
void DFS(int ind_nod, long long cod, int l) {
if (ind_nod <= n) {
rez[ind_nod] = cod;
lung[ind_nod] = l;
return;
}
DFS(mu[ind_nod][0], cod << 1, l + 1);
DFS(mu[ind_nod][1], (cod << 1) | 1, l + 1);
}
int main() {
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
init.push(i);
}
nr = n;
while ((int)init.size() + (int)intern.size() > 1) {
long long a, b;
a = getMin();
b = getMin();
int c;
nr++;
c = nr;
v[c] = v[a] + v[b];
intern.push(c);
mu[nr][0] = a;
mu[nr][1] = b;
s += v[c];
}
DFS(nr, 0, 0);
fout << s;
for (int i = 1; i <= n; ++i)
fout << lung[i] << rez[i];
return 0;
}