Cod sursa(job #1100088)

Utilizator superman_01Avramescu Cristian superman_01 Data 6 februarie 2014 16:34:14
Problema Coduri Huffman Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
 
#define NMAX 1000005
#define SZ 9500000
 

using namespace std;
 
ifstream in ( "huffman.in" );
ofstream out ( "huffman.out" );
 
struct Huffman {
    int son[2];
}Nodes[2*NMAX];
 
queue < pair < long long, int > > Q_first , Q_second;
pair < long long , int>   A , B;
int N , K,Len[NMAX];
long long Code[NMAX] , Answer;
char input[SZ],*ina=input;
     
inline int atoi()
{
    int nr=0;
    for(;!(*ina>='0' && *ina<='9');++ina);
    for(;*ina>='0' && *ina<='9';++ina)
        nr=nr*10+(*ina-'0');
    return nr;
}
void Extract ( pair <long long , int > &V)
{
    if ( Q_second.empty() and Q_first.empty() )
        return ; 
      if ( !Q_second.empty())
      {
          if ( !Q_first.empty() )
          {
          if ( Q_first.front().first < Q_second.front().first ) 
               V = Q_first.front() , Q_first.pop();
          else
               V = Q_second.front() , Q_second.pop();
          }
          else V = Q_second.front() , Q_second.pop();
      }
      else V = Q_first.front() , Q_first.pop();
}
void DepthFirstSearch ( int i , long long config , int lvel )
{
    if ( Nodes[i].son[0] )
    { 
        DepthFirstSearch ( Nodes[i].son[0] , ( config <<1 ), lvel + 1 ); 
        DepthFirstSearch ( Nodes[i].son[1] , ( config <<1 ) + 1 , lvel + 1 );
        return ;
    }
    Len[i] = lvel;
    Code[i] = config;
}
 
int main ( void )
{
    int i , j , x ;
	in.read( input , SZ );
    N = atoi();
    for ( i = 1 ; i <= N ; ++i )
        x = atoi() , Q_first.push(make_pair ( x, i));
    K = N + 1;
    for ( ; !Q_first.empty() or !Q_second.empty() ; )
    {
        Extract ( A );
        Extract ( B );
        Answer += A.first + B.first;
        Nodes[++K].son[0] = A.second;
        Nodes[K].son[1] = B.second;
        if ( A.first != 0 and B.second !=0 )
        Q_second.push( make_pair(A.first + B.first , K) );
        else --K,Answer -= A.first;
        A.first = A.second = B.first = B.second = 0;
    }
    DepthFirstSearch ( K , 0 , 0  );
    out << Answer << "\n";
    for ( i = 1 ; i <= N ; ++i )
        out << Len[i] << " " <<Code[i] << "\n";
    in.close();
    out.close();
    return 0;
}