Cod sursa(job #1263982)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 15 noiembrie 2014 13:52:03
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>

#define NMAX 1000005
#define lint int
#define int long long int
using namespace std;

struct nod{
    int fiu_st,fiu_dr;
    lint frecv;
    bool leaf;

    int ans1,ans2;

    nod(int fiu_st=0, int fiu_dr=0, lint frecv=0, bool leaf=0, int ans1=0, int ans2=0): fiu_st(fiu_st), fiu_dr(fiu_dr), frecv(frecv), leaf(leaf), ans1(ans1), ans2(ans2) {}
}nodes[2*NMAX];

int coada1[NMAX];
int coada2[NMAX];
int st1,dr1,st2,dr2;

void dfs(int nod,int cod,int depth){
    if(nodes[nod].leaf){
        //cout<<depth<<' '<<cod<<'\n';
        nodes[nod].ans1=depth;
        nodes[nod].ans2=cod;
    }
    else{
        if(nodes[nod].fiu_st)
            dfs(nodes[nod].fiu_st,cod<<1,depth+1);
        if(nodes[nod].fiu_dr)
            dfs(nodes[nod].fiu_dr,(cod<<1)+1,depth+1);
    }
}

inline int ext(){
    if(st1<=dr1 && st2<=dr2){
        if(nodes[coada1[st1]].frecv<nodes[coada2[st2]].frecv)
            return coada1[st1++];
        else
            return coada2[st2++];
    }

    if(st1<=dr1)
        return coada1[st1++];
    return coada2[st2++];
}

signed main()
{
    ifstream cin("huffman.in");
    ofstream cout("huffman.out");

    ios_base::sync_with_stdio(false);

    int n=0,i;
    cin>>n;

    int poz=0;
    st1=1,st2=1,dr1=n,dr2=0;

    for(i=1;i<=n;i++){
        cin>>nodes[++poz].frecv;
        nodes[poz].leaf=true;

        coada1[i]=i;
    }

    lint ans=0;
    int n1,n2;

    while(dr1-st1+dr2-st2+1){
        n1=ext();
        n2=ext();

        //cout<<"am extras "<<n1<<' '<<n2<<endl;

        nodes[++poz].fiu_st=n1;
        nodes[poz].fiu_dr=n2;
        nodes[poz].frecv=nodes[n1].frecv+nodes[n2].frecv;

        ans+=nodes[poz].frecv;

        coada2[++dr2]=poz;
    }

    cout<<ans<<'\n';
    dfs(2*n-1,0,0);

    for(i=1;i<=n;i++)
        cout<<nodes[i].ans1<<' '<<nodes[i].ans2<<'\n';

    cin.close();
    cout.close();
    return 0;
}