Cod sursa(job #2889670)

Utilizator GiscaDianaGisca Diana Elena GiscaDiana Data 13 aprilie 2022 01:05:16
Problema Coduri Huffman Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <vector>
#include <iostream>

using namespace std;

ifstream fin("huffman.in");
ofstream fout("huffman.out");

vector <int> smb;
vector <pair<int,long long>> rez;
vecotr <pair<int,int>> fi;

int nrsmb, i, j, a, b, m;
long long suma;

void intrare(int rad, int biti, long long suma1)
{
    if(rad < nrsmb)
    {
        rez[rad].first=biti;
        rez[rad].second=suma1;
    }
    intrare(fi[rad].first, biti+1,suma1*2);
    intrare(fi[rad].second,biti+1,suma1*2+1);
}

int main()
{
    fin>>nrsmb;
    pair <int,int> nul(0,0);
    smb.assign(nrsmb*2,0);
    rez.assign(nrsmb,nul);
    fi.assign(nrsmb*2,nul);
    for(i=0;i<nrsmb;i++)
        fin>>smb[i];
    smb[nrsmb]=smb[0]+smb[1];
    fi[nrsmb]=make_pair(0,1);
    k=0;
    j=1;
    for(i=2;i<nrsmb-1;i++)
    {
        a=smb[i];
        if(smb[i+1] < smb[nrsmb+m])
        {
            b=smb[i];
            smb[nrsmb+j]=a+b;
            fi[nrsmb+j]=make_pair(i,nrsmb+m);
            m++;
        }
        j++;
    }

    if(i==nrsmb-1)
    {
        a=smb[i];
        b=smb[nrsmb+m];
        smb[nrsmb+j]=a+b;
        fi[nrsmb+j]=make_pair(i,nrmsb+m);
        m++,j++;
    }
    while(j < nrsmb-1)
    {
        a=smb[nrsmb+m];
        b=smb[nrsmb+m+1];
        smb[nrsmb+j]=a+b;
        fi[nrsmb+j]=make_pair(nrsmb+m,nrsmb+m+1);
        m = m+2;j++;
    }

    for(i=nrsmb;i<nrsmb*2-1;i++)
    {
        suma = suma + smb[i];
    }
    intrare(nrsmb*2-2,0,0);
    fout<<suma<<'\n';
    for(i=0;i<nrsmb;i++)
        fout<<rez[i].first<<' '<<rez[i].second<<'\n';
    return 0;
}