Cod sursa(job #1067060)

Utilizator jul123Iulia Duta jul123 Data 26 decembrie 2013 11:05:53
Problema Coduri Huffman Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.72 kb
#include<iostream>
#include<cstdio>

using namespace std;
typedef struct un_nod{
long long val;
long  st;
long  dr;
}nodul;
nodul nod[2000200];

long long codul[1000100];
long nivelul[1000100];
void DF(long  poz, long long cod, long  nivel)
{
    if(nod[poz].st!=-1)
    {
        DF(nod[poz].st, 2*cod, nivel+1);
        DF(nod[poz].dr, 2*cod+1, nivel+1);
    }
    codul[poz]=cod;
    nivelul[poz]=nivel;
}
long long c[2000200];
long v[1000100];
int main()
{
    FILE *fin, *fout;
    fin=fopen("huffman.in", "r");
    fout=fopen("huffman.out", "w");

    long  i, n, ultimv, primv, ultimc, primc, k;
    long long s, m;
    fscanf(fin, "%ld", &n);

    for(i=0; i<n; i++)
    {
        fscanf(fin, "%ld", &v[i]);
        nod[i].val=v[i];
        nod[i].st=-1;
        nod[i].dr=-1;
    }
    c[1]=v[0]+v[1];
    ultimv=n-1;
    primv=2;
    primc=1;
    ultimc=1;
    s=0;
    nod[n].val=c[1];
    nod[n].st=0;
    nod[n].dr=1;
    k=n+1;
    int nr=0;
    while(primv<=ultimv || primc<=ultimc)
    {
        if(primv>ultimv)
        {
            ultimc++;
            c[ultimc]=c[primc]+c[primc+1];
            primc+=2;
            nod[k].val=c[ultimc];
            nod[k].st=primc-2+n-1;
            nod[k].dr=primc+n-1-1;
            k++;
            nr++;
        }
        else
        {
            if(v[primv]<=c[primc] )
            {
               /*ultimc++;*/
               m=v[primv];
               primv++;
               nod[k].st=primv-1;
            }
            else
            {
               /*ultimc++;*/
               m=c[primc];
               primc++;
               nod[k].st=primc+n-1-1;
            }
            if(primv<=ultimv && primc>ultimc)
            {
               ultimc++;
                c[ultimc]=m+v[primv];
                primv++;
                nod[k].val=c[ultimc];
                nod[k].dr=primv-1;
                k++;

            }
            else
            {if(primv>ultimv || v[primv]>c[primc])
            {
                ultimc++;
                c[ultimc]=m+c[primc];
                primc++;
                nod[k].val=c[ultimc];
                nod[k].dr=primc+n-1-1;
                k++;
            }
            else
            {
                ultimc++;
                c[ultimc]=m+v[primv];
                primv++;
                nod[k].val=c[ultimc];
                nod[k].dr=primv-1;
                k++;

            }
            }
        }
    }
    DF(k-2, 0, 0);
    for(i=1; i<ultimc; i++)
        {
            s+=(long long)c[i];
        }
    fprintf(fout,"%lld\n", s);
    for(i=0; i<n; i++)
        fprintf(fout, "%ld %lld\n", nivelul[i], codul[i]);
}