Cod sursa(job #2433482)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 27 iunie 2019 16:36:55
Problema Coduri Huffman Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#include <queue>
struct nod
{
  long long c;
  int l[2];
};

int counttt[1005000];
long long b[1005000];
nod v[2005000];
std::ifstream fin("huffman.in");
std::ofstream fout("huffman.out");
int n;
int countt;
std::queue<int> q1;
std::queue<int> q2;
long long sum;
void get(std::queue<int> & q, int & v1)
{
  v1= q.front();
  q.pop();
}
inline void travel(int n1,int cc, long long bb)
{
  bool ok=false;
  for(int i=0;i<2;i++)
    if(v[n1].l[i]!=-1)
    {
      travel(v[n1].l[i],cc+1,(bb<<1)+i);
      ok=true;
    }
  if(!ok)
  {
    counttt[n1]=cc;
    b[n1]=bb;
  }
}

int main()
{
  fin>>n;
  for(int i=0;i<n;i++)
  {
    int j;
    fin>>j;
    v[i]={j,{-1,-1}};
    q1.push(i);
  }
  countt=n;
  while(!q1.empty() || q2.size()>1)
  {
    int v1[2];
    for(int i=0;i<2;i++)
    {
      if(q1.empty()|| (!q2.empty() && v[q1.front()].c>v[q2.front()].c))
        get(q2,v1[i]);
      else
        get(q1,v1[i]);
    }
    long long v0c=v[v1[0]].c;
    long long v1c=v[v1[1]].c;
    v[countt]={v0c+v1c,{v1[0],v1[1]}};
    q2.push(countt);
    sum+=v0c+v1c;
    countt++;
  }
  travel(countt-1,0,0);
  fout<<sum<<"\n";
  for(int i=0;i<n;i++)
    fout<<counttt[i]<<" "<<b[i]<<"\n";
}