Cod sursa(job #601893)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 8 iulie 2011 10:30:40
Problema Coduri Huffman Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb
#include<fstream.h>
#define N 2000001
typedef struct nod
{long info,val;
nod *st,*dr;}Nod;
long long q2[N];
long n,i,j,k;
unsigned int q1[N];
Nod *p[N],*l;
int main()
{ifstream f1("huffman.in");
ofstream f2("huffman.out");
f1>>n;
for(i=1;i<=n;i++)
       {f1>>q1[i];
       q2[i]=N;
       p[i]=new Nod;
       p[i]->info=q1[i];
       p[i]->val=i;
       p[i]->st=p[i]->dr=NULL;}
j=k=1,q2[0]=0;
for(i=1;i<n;i++)
if(k<=n)
        {p[i+n]=new Nod;
        if(q1[k+1]<=q2[j]&&k+1<=n)
                 {q2[i]=q1[k]+q1[k+1];
                 p[i+n]->st=p[k];
                 p[i+n]->dr=p[k+1];
                 k+=2;}
        else
                 if(q2[j+1]<=q1[k])
                           {q2[i]=q2[j]+q2[j+1];
                           p[i+n]->st=p[j+n];
                           p[i+n]->dr=p[j+1+n];
                           j+=2;}
                 else
                           if(q2[j]<=q1[k]&&q1[k]<=q2[j+1])
                                    {q2[i]=q1[k]+q2[j];
                                    p[i+n]->st=p[j+n];
                                    p[i+n]->dr=p[k];
                                    j++,k++;}
                           else
                                    if(q1[k]<=q2[j]&&((q2[j]<=q1[k+1]&&k+1<=n)||k+1>n))
                                             {q2[i]=q1[k]+q2[j];
                                             p[i+n]->st=p[k];
                                             p[i+n]->dr=p[j+n];
                                             j++,k++;}
        p[i+n]->info=q2[i];
        p[i+n]->val=i+n;
        q2[0]+=q2[i];}
else
        {q2[i]=q2[j]+q2[j+1];
        q2[0]+=q2[i];
        p[i+n]=new Nod;
        p[i+n]->info=q2[i];
        p[i+n]->val=i+n;
        p[i+n]->st=p[j+n];
        p[i+n]->dr=p[j+1+n];
        j+=2;}
f2<<q2[0]<<"\n";
l=p[2*n-1];
k=j=q2[l->val]=q1[l->val]=0;
p[j++]=l;
while(k<j)
        {l=p[k++];
        if(l->st)
                 {q1[l->st->val]=q1[l->val]+1;
                 q2[l->st->val]=q2[l->val]<<1;
                 p[j++]=l->st;}
        if(l->dr)
                 {q1[l->dr->val]=q1[l->val]+1;
                 q2[l->dr->val]=(q2[l->val]<<1)+1;
                 p[j++]=l->dr;}}
for(i=1;i<=n;i++)
        f2<<q1[i]<<" "<<q2[i]<<"\n";
f1.close();
f2.close();
return 0;}