Cod sursa(job #978297)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 28 iulie 2013 16:38:46
Problema Coduri Huffman Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.95 kb
#include <iostream>
#include <fstream>
using namespace std;
struct nod
{
    nod *ant,*dr,*st;
    unsigned long long inf;
} *p,*q,*rad;
struct sir
{
    sir *urm;
    nod *attach;
} *prim,*ps,*ultim;
struct localizer
{
    nod *urm;
} loc[1000002];
int v[1000002],n,i,l,c;
unsigned long long s;
int main(void)
{
    FILE * f;
    f=fopen("huffman.in","r");
    ofstream g("huffman.out");
    fscanf(f,"%d",&n);
    for (i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);
    p=new(nod);
    p->ant=NULL;
    q=new(nod);
    q->inf=v[1]*10;
    p->st=q;
    q->st=q->dr=NULL;
    q->ant=p;
    loc[1].urm=q;
    q=new(nod);
    q->inf=v[2]*10+1;
    q->st=q->dr=NULL;
    p->dr=q;
    p->inf=v[1]+v[2];
    loc[2].urm=q;
    q->ant=p;
    s=s+p->inf;
    ps=new(sir);
    ps->attach=p;
    ps->urm=NULL;
    ultim=prim=ps;
    i=3;
    while (i<=n)
        if ((i<=n-1)&&(v[i]+v[i+1]<v[i]+prim->attach->inf))
        {
            p=new(nod);
            p->ant=NULL;
            q=new(nod);
            q->inf=v[i]*10;
            loc[i].urm=q;
            q->st=q->dr=NULL;
            q->ant=p;
            p->st=q;
            q=new(nod);
            q->ant=p;
            q->inf=v[i+1]*10+1;
            loc[i+1].urm=q;
            q->st=q->dr=NULL;
            p->dr=q;
            p->inf=v[i]+v[i+1];
            s=s+p->inf;
            ps=new(sir);
            ps->attach=p;
            ps->urm=NULL;
            ultim->urm=ps;
            ultim=ps;
            i=i+2;
        }
        else
            if ((prim->urm==NULL)||(v[i]+prim->attach->inf<(prim->attach->inf+prim->urm->attach->inf)))
            {
                p=new(nod);
                p->ant=NULL;
                q=new(nod);
                q->ant=p;
                q->inf=v[i]*10;
                loc[i].urm=q;
                q->st=q->dr=NULL;
                p->st=q;
                q=prim->attach;
                q->ant=p;
                p->inf=v[i]+q->inf;
                s=s+p->inf;
                q->inf=(q->inf)*10+1;
                p->dr=q;
                ps=new(sir);
                ps->urm=NULL;
                ps->attach=p;
                ultim->urm=ps;
                ultim=ps;
                ps=prim;
                prim=prim->urm;
                delete(ps);
                i++;
            }
            else
            {
                p=new(nod);
                p->ant=NULL;
                q=prim->attach;
                q->ant=p;
                q->inf=(q->inf)*10;
                p->dr=q;
                q=prim->urm->attach;
                q->ant=p;
                q->inf=(q->inf)*10+1;
                p->st=q;
                p->inf=(p->dr->inf+p->st->inf)/10;
                s=s+p->inf;
                ps=new(sir);
                ps->urm=NULL;
                ps->attach=p;
                ultim->urm=ps;
                ultim=ps;
                ps=prim;
                prim=prim->urm;
                delete(ps);
                ps=prim;
                prim=prim->urm;
                delete(ps);
            }
    while (prim!=ultim)
    {
        p=new(nod);
        p->ant=NULL;
        q=prim->attach;
        q->ant=p;
        q->inf=(q->inf)*10;
        p->dr=q;
        q=prim->urm->attach;
        q->ant=p;
        q->inf=(q->inf)*10+1;
        p->st=q;
        p->inf=(p->dr->inf+p->st->inf)/10;
        s=s+p->inf;
        ps=new(sir);
        ps->urm=NULL;
        ps->attach=p;
        ultim->urm=ps;
        ultim=ps;
        ps=prim;
        prim=prim->urm;
        delete(ps);
        ps=prim;
        prim=prim->urm;
        delete(ps);
    }
    rad=prim->attach;
    g<<s<<'\n';
    for (i=1;i<=n;i++)
    {
        p=loc[i].urm;
        c=0;
        l=0;
        while (p!=rad)
        {
            c=c*2+(p->inf)%10;
            l++;
            p=p->ant;
        }
        g<<l<<' '<<c<<'\n';
    }
    g.close();
    return 0;
}