Cod sursa(job #830784)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 7 decembrie 2012 18:17:25
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<stdio.h>
#include<fstream>
using namespace std;

ifstream f("huffman.in");
FILE *g = fopen("huffman.out","w");

typedef struct _nod
{
    long long info;
    int F[2];
} nod;

#define MaxN 1000100
#define MaxP 2
#define ll long long
#define sh short int
#define MaxS (MaxN*10)

int N;
ll Sol;
sh SolVA[MaxN];
ll SolVB[MaxN];
char S[MaxS];
nod A[(MaxN<<1)+100];

void citire(void)
{
    int nr = 0;

    f >> N;
    f.getline(S,MaxS,EOF);
    for(int i=0;S[i];i++)
        if(isdigit(S[i]))
            for(++nr;isdigit(S[i]);A[nr].info = A[nr].info*10+S[i++]-'0');
}

inline void creare(int poz,sh depth,ll nr)
{
    if(poz <= N)
    {
        SolVA[poz] = depth;
        SolVB[poz] = nr;

        return ;
    }

    creare(A[poz].F[0],depth+1,nr*2);
    creare(A[poz].F[1],depth+1,nr*2+1);
}

void Rezolvare(void)
{
    int pozA = 1,pozB = N+1,pozNOU = N,pozF;
    ll min;

    for(int i=1;i<N;i++)
    {
        if(pozA > N || (pozB <= pozNOU && A[pozA].info > A[pozB].info))
            min = A[pozB].info,pozF = pozB++;
        else
            min = A[pozA].info,pozF = pozA++;
        A[pozNOU+1].info = min; A[pozNOU+1].F[0] = pozF;

        if(pozA > N || (pozB <= pozNOU && A[pozA].info > A[pozB].info))
            min = A[pozB].info,pozF = pozB++;
        else
            min = A[pozA].info,pozF = pozA++;

        A[pozNOU+1].info += min; A[pozNOU+1].F[1] = pozF;

        Sol += A[++pozNOU].info;
    }

    creare(pozNOU,0,0LL);
}

int main()
{
    citire();
    Rezolvare();

    fprintf(g,"%lld\n",Sol);
    for(int i=1;i<=N;i++)
        fprintf(g,"%hd %lld\n",SolVA[i],SolVB[i]);
}