Cod sursa(job #479331)

Utilizator andra23Laura Draghici andra23 Data 23 august 2010 18:11:03
Problema Coduri Huffman Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<iostream>
#include<fstream>

using namespace std;

int c1[1000010], st[2000010], dr[2000010];
long long c2[1000010];
int h[1000010], val[1000010], n;

void inordine(int nod, int hh, int v){
    if (nod <= n){
        h[nod] = hh;
        val[nod] = v;    
    }
    else {
        inordine(st[nod], hh+1, v<<1);
        inordine(dr[nod], hh+1, (v<<1)+1);
    }    
}

int main(){
    ifstream f("huffman.in");
    ofstream g("huffman.out");
    int i, min1, min2, stang, drept;
    f>>n;
    for (i = 1; i <= n; i++)
        f>>c1[i];
    long long sg = 0;
    
    int p1 = 1;
    int p2 = 1;
    c1[n+1] = 200000000;
    c2[1] = 200000000;
    int u = 0;
    int nr = 0;
    while (p2 < n-1){
        if (p2 <= u && c2[p2] <= c1[p1]){
            min1 = c2[p2];
            stang = n+p2;
            p2++;
        }
        else {
            min1 = c1[p1];
            stang = p1;
            p1++;
        }  
        if (p2 <= u && c2[p2] <= c1[p1]){
            min2 = c2[p2];
            drept = n+p2;
            p2++;
        }
        else {
            min2 = c1[p1];
            drept = p1;
            p1++;
        }  
        u++;
        c2[u] = min1+min2;
        sg = sg+c2[u]; 
        st[n+u] = stang;
        dr[n+u] = drept;  
    }    
        
    inordine (2*n-1, 0, 0);    
     
    g<<sg<<'\n';
    for (i = 1; i <= n; i++)
        g<<h[i]<<" "<<val[i]<<'\n';
    
    return 0;    
}