Cod sursa(job #1971483)

Utilizator GinguIonutGinguIonut GinguIonut Data 20 aprilie 2017 14:38:14
Problema Coduri Huffman Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#include <algorithm>
#include <cstdio>

#define buffMax 1000
#define nMax 1000001
#define INF 4000000000000000

using namespace std;

ifstream fin("huffman.in");
ofstream fout("huffman.out");

int l[2], r[2], q[2][nMax], length[2*nMax], k, poz;
char buff[buffMax];
long long Sol, code[2*nMax], n;

void read(long long &nr)
{
    nr=0;
    while(buff[poz]<'0' || buff[poz]>'9')
    {
        poz++;
        if(poz==buffMax)
        {
            poz=0;
            fread(buff, 1, buffMax, stdin);
        }
    }

    while(buff[poz]>='0' && buff[poz]<='9')
    {
        nr=nr*10+buff[poz]-'0';
        poz++;
        if(poz==buffMax)
        {
            poz=0;
            fread(buff, 1, buffMax, stdin);
        }
    }
}

struct simboluri
{
    long long val;
    int bit[2];
}s[2*nMax];

void dfs(int node, long long cod, int len)
{
    if(s[node].bit[0])
    {
        dfs(s[node].bit[0], 2*cod, len+1);
        dfs(s[node].bit[1], 2*cod+1, len+1);
    }

    length[node]=len;
    code[node]=cod;
}

int main()
{
    freopen("huffman.in", "r", stdin);
    fread(buff, 1, buffMax, stdin);
    read(n);
    for(int i=1; i<=n; i++)
    {
        read(s[i].val);
        q[0][i]=i;
    }

    if(n==1)
    {
        fout<<s[1].val<<'\n'<<1<<" "<<0;
        return 0;
    }
    l[0]=l[1]=1;
    r[0]=k=n;

    while(l[0]+l[1]<=r[0]+r[1])
    {
        k++;
        for(int i=0; i<2; i++)
        {
            int poz=0;
            long long Min=INF;
            for(int j=0; j<2; j++)
            {
                if(s[q[j][l[j]]].val<Min && l[j]<=r[j])
                {
                    poz=j;
                    Min=s[q[j][l[j]]].val;
                }
            }
            s[k].val+=Min;
            s[k].bit[i]=q[poz][l[poz]];
            l[poz]++;
        }

        Sol+=s[k].val;
        q[1][++r[1]]=k;
    }

    dfs(k, 0, 0);

    fout<<Sol<<'\n';
    for(int i=1; i<=n; i++)
        fout<<length[i]<<" "<<code[i]<<'\n';
}