Cod sursa(job #696141)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 28 februarie 2012 17:06:41
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<stdio.h>
#include<queue>
#include<vector>
#include<string>

using namespace std;

struct nod
{
    int freq,ind;
    vector<nod> childs;
};

struct cmp
{
    bool operator()(const nod &a,const nod &b)
    {
        return a.freq>b.freq;
    }
};

int n,size=0;
priority_queue<nod,vector<nod>,cmp> Q;
string codS[10000];
int freqs[100000];

void expand()
{
    nod n;
    n.childs.push_back(Q.top());
    Q.pop();
    n.childs.push_back(Q.top());
    Q.pop();
    n.freq=n.childs[0].freq+n.childs[1].freq;
    Q.push(n);
}

void df(nod n,string s)
{
    if(n.childs.size()>0)
    {
        df(n.childs[0],s+'0');
        df(n.childs[1],s+'1');
    }
    else codS[n.ind]=s;
}

int strToInt(string s)
{
	int ret=0;
	int pow=1;
	for(int i=0;i<s.length();i++)
	{
		ret+=(s[i]-48)*pow;
		pow*=2;
	}
	return ret;
}

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

    scanf("%d\n",&n);
    for(int i=0;i<n;i++)
    {
        int x;
        scanf("%d\n",&x);
        nod n;
        n.freq=x;
		freqs[i]=x;
        n.ind=i;
        Q.push(n);
    }

    while(Q.size()>1)expand();
    df(Q.top(),"");
	
	int s;
	for(int i=0;i<n;i++)s+=freqs[i]*codS[i].length();
	printf("%d\n",s);
	
	for(int i=0;i<n;i++)//printf("%s\n",codS[i].c_str());
	{
		printf("%d %d\n",codS[i].length(),strToInt(codS[i]));
	}
}