Cod sursa(job #2006566)

Utilizator Y0da1NUME JMECHER Y0da1 Data 30 iulie 2017 18:31:04
Problema Coduri Huffman Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 3.08 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <deque>
#include <iostream>
#define MAXN 1000005
using namespace std;
char fisier [10000000], c;
struct nod{
    int64_t lu;
    nod * st = NULL;
    nod * dr = NULL;
    int pos=0;
};
const bool operator < (const nod n1, const nod n2)
{
    return n1.lu<n2.lu;
}
nod Q[MAXN];
nod * Q2[MAXN];
uint64_t lg [MAXN], b[MAXN], n=0, T;
void DF (nod * curr, int64_t cod, int lvl)
{
    //cout<<"FAC DEFEU PE NODUL "<<curr<<"("<<curr->lu<<") CU FIII "<<curr->st<<" "<<curr->dr<<"\n";
    if(curr->dr!=NULL && curr->st!=NULL)
    {
        DF(curr->st, cod<<1, lvl+1);
        DF(curr->dr, cod<<1 | 1, lvl+1);
        return;
    }
    lg[curr->pos+1]=lvl;
    b[curr->pos+1]=cod;
}
int main()
{
    nod * x[2];
    nod cv;
    int cnt=0, q1=0, q2=0, j=0, nr=0;
    ifstream in ("huffman.in");
    ofstream out ("huffman.out");
    //ofstream debug("debug.txt");
    //parsam plm
    in.read(fisier, 10000000);
    while (c!='\n')
    {
        c=fisier[j];
        if('0'<=c && c<='9')
        {
            n*=10;
            n+=(c-'0');
        }
        ++j;
    }
    while(fisier[j]>'9' || fisier[j]<'0')
        ++j;
    while(c!=0)
    {
        c=fisier[j];
        //cout<<c<<" ";
        if('0' <= c && c <='9')
        {
            nr*=10;
            nr+= (c - '0');
            ++j;
        }
        else
        {
            cv.lu=nr;
            cv.pos=cnt;
            Q[cnt]=cv;
            ++cnt;
            ++j;
            nr=0;
        }
    }
    //debug<<n<<"\n";
    //for(int i=0;i<n;++i)
        //debug<<Q[i].lu<<"\n";
    cnt=0;
    while(cnt<n-1)    //mai avem noduri neprocesate
    {
        x[0]=NULL;
        x[1]=NULL;
        for(int i=0;i<2;++i)
        {
            if(n-q1==0)
            {
                x[i]=Q2[q2];
                //cout<<"IAU ELEMENTUL "<<x[i]->lu<<"("<<q2<<") DIN COADA Q2\n";
                ++q2;
            }
            else if(cnt-q2==0)
            {
                x[i]=&Q[q1];
                //cout<<"IAU ELEMENTUL "<<x[i]->lu<<"("<<q1<<") DIN COADA Q1\n";
                ++q1;

            }
            else //if(!Q.empty() && !Q2.empty())
            {
                if(Q[q1].lu<Q2[q2]->lu)
                {

                    x[i]=&Q[q1];
                    //cout<<"IAU ELEMENTUL "<<x[i]->lu<<"("<<q1<<") DIN COADA Q1\n";
                    ++q1;
                }

                else
                {
                    x[i]=Q2[q2];
                    //cout<<"IAU ELEMENTUL "<<x[i]->lu<<"("<<q2<<") DIN COADA Q2\n";
                    ++q2;
                }


            }
        }
        nod * p = new nod;
        p->st=x[0];
        p->dr=x[1];
        p->lu=x[0]->lu+x[1]->lu;
        p->pos=cnt;
        //cout<<p->st<<" "<<p->dr<<"\n";
        T=T+p->lu;
        Q2[cnt]=p;
        ++cnt;
    }
    out<<T<<"\n";
    DF(Q2[q2], 0, 0);
    for(int i=1;i<=n;++i)
        out<<lg[i]<<" "<<b[i]<<"\n";
    in.close();
    out.close();
    return 0;
}