Advertisement
yuawn

algo2017_week6_huffman

Nov 13th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define pb push_back
  4. #define ALL(o) (o).begin(),(o).end()
  5. #define fo(n) for(int i=0;i<n;i++)
  6.  
  7. struct node{
  8.     char c;
  9.     int n;
  10.     node *l , *r;
  11.     node(){ l = r = NULL; n = 0; c = 'x'; }
  12. };
  13.  
  14. struct st{
  15.     int n;
  16.     node *r;
  17.     st(){ n = 0; r = NULL; }
  18. };
  19.  
  20. node *root = new node();
  21. map<char,int> mp;
  22.  
  23. bool cmp( st a , st b ){ return a.n > b.n; }
  24. bool cmp2( char a , char b ){ return mp[a] < mp[b]; }
  25.  
  26. vector<int> bit;
  27.  
  28. void dfs( node *now ){
  29.    
  30.     if( !now->l && !now->r ){
  31.         int sum = 0 , t = 1;
  32.         for( int i = bit.size() - 1 ; i > -1 ; --i ) sum += bit[i] * t , t *= 10;  
  33.         mp[now->c] = sum;
  34.         return;
  35.     }
  36.    
  37.     if( now->l ){
  38.         bit.pb(0);
  39.         dfs( now->l );
  40.         bit.pop_back();
  41.     }
  42.     if( now->r ){
  43.         bit.pb(1);
  44.         dfs( now->r );
  45.         bit.pop_back();
  46.     }
  47.  
  48.     return;
  49. }
  50.  
  51.  
  52. int main(){
  53.  
  54.     string s;
  55.    
  56.     cin >> s;
  57.    
  58.     vector<char> p;
  59.    
  60.     fo( s.size() ){
  61.         if( !mp[s[i]] ) p.pb( s[i] );
  62.         mp[s[i]]++;
  63.     }
  64.    
  65.     vector<st> q;
  66.  
  67.     fo( p.size() ){
  68.         node *a = new node();
  69.         a->c = p[i];
  70.         a->n = mp[p[i]];
  71.        
  72.         st b;
  73.         b.n = mp[p[i]];
  74.         b.r = a;
  75.         q.pb( b );
  76.     }
  77.    
  78.     sort( ALL(q) , cmp );
  79.    
  80.     while( q.size() > 1 ){
  81.         sort( ALL(q) , cmp );
  82.        
  83.         st a = q.back();
  84.         q.pop_back();
  85.         st b = q.back();
  86.         q.pop_back();
  87.        
  88.         node *c = new node();
  89.        
  90.         c->n = a.n + b.n;
  91.         c->l = a.n < b.n ? a.r : b.r;
  92.         c->r = a.n < b.n ? b.r : a.r;
  93.        
  94.         st d;
  95.         d.n = c->n;
  96.         d.r = c;
  97.        
  98.         q.pb( d ); 
  99.     }
  100.    
  101.     dfs( q[0].r );
  102.    
  103.     sort( ALL(p) , cmp2 );
  104.    
  105.     fo( p.size() ) printf("%c:%d\n" , p[i] , mp[p[i]]);
  106.  
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement