Cod sursa(job #2687279)

Utilizator davidcotigacotiga david davidcotiga Data 19 decembrie 2020 17:56:24
Problema Coduri Huffman Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#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;
}