Cod sursa(job #1995515)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 28 iunie 2017 12:01:09
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#include <queue>

using namespace std;

const int N = 1000;

struct Nod{
	int val, frec;
};

struct Tata{
	int tata;
	int bit;
};

Nod noduri[N];
Tata tati[N];

int nrDeScazut;
int n;
int nn;
queue<Nod> q1;
queue<Nod> q2;

void citire()
{
	scanf("%d", &n);
	nn = n;
	Nod tmpx;
	int tmp;

	for(int i = 0; i < n; i++)
	{
		scanf("%d", &tmp);
		tmpx.frec = tmp;
		tmpx.val = i;

		q1.push(tmpx);
		nrDeScazut += tmp;
	}
}

Nod gasireMinim()
{
	Nod tmp1, tmp2;

	if(q1.empty() == true)	
	{
		tmp1 = q2.front();	
		q2.pop();
		return tmp1;
	}

	if(q2.empty() == true)	
	{
		tmp1 = q1.front();	
		q1.pop();
		return tmp1;
	}

	tmp1 = q1.front();
	tmp2 = q2.front();

	if(tmp1.frec <= tmp2.frec)
	{
		q1.pop();	
		return tmp1;
	}
	else
	{
		q2.pop();
		return tmp2;
	}
}

void solve()
{
	Nod nr1, nr2;
	int solutie = 0;

	while(q1.empty() == false || q2.empty() == false)
	{
		nr1 = gasireMinim();
		nr2 = gasireMinim();
		solutie += (nr1.frec + nr2.frec);

		tati[nr1.val].tata = tati[nr2.val].tata = n;

		tati[nr1.val].bit = 0;
		tati[nr2.val].bit = 1;

		Nod nox;
		nox.val = n;
		nox.frec = nr1.frec + nr2.frec;

		q2.push(nox);
		n++;
	}

	printf("%d\n", solutie - nrDeScazut);

	for(int i = 0; i < nn; i++)
	{
		int x = i;
		int val = 0;
		int put = 1;
		int l = 0;
		
		while(x != n - 1)
		{
			if(tati[x].bit == 1)
			{
				val += put;
			}

			put <<= 1;
			l++;
			x = tati[x].tata;
		}

		printf("%d %d\n", l - 1, val);
	}
}

int main()
{
	freopen("huffman.in", "r", stdin);
	freopen("huffman.out", "w", stdout);

	citire();
	solve();

	return 0;
}