Advertisement
Guest User

Untitled

a guest
Feb 12th, 2016
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <cmath>
  8. #include <vector>
  9. #include <map>
  10. #include <set>
  11. #include <stack>
  12. #include <list>
  13. #include <queue>
  14. #include <deque>
  15. #include <string>
  16. using namespace std;
  17.  
  18. vector <int> symbolsNum(1000, 0);
  19. priority_queue <pair <int, int>, vector < pair <int, int> >, greater < pair <int, int> > > qSymbols;
  20. vector <pair <int, int> > vertex;
  21.  
  22. int main()
  23. {
  24.     char inp = ' ';
  25.     while(cin.get(inp))
  26.     {
  27.         if(int(inp) != 10)
  28.         {
  29.             symbolsNum[int(inp)]++;
  30.         }
  31.     }
  32.     for(int i = 0; i < 1000; i++)
  33.     {
  34.         if(symbolsNum[i])
  35.         {
  36.             vertex.push_back(make_pair(symbolsNum[i], -1));
  37.         }
  38.     }
  39.     if(vertex.size() == 1) // если один символ
  40.     {
  41.         cout << vertex[0].first;
  42.         return 0;
  43.     }
  44.     sort(vertex.begin(), vertex.end());
  45.     for(int i = 0; i < vertex.size(); i++)
  46.     {
  47.         qSymbols.push(make_pair(vertex[i].first, i));
  48.     }
  49.     while(qSymbols.size() != 1)
  50.     {
  51.         pair <int, int> v1, v2;
  52.         v1 = qSymbols.top();
  53.         qSymbols.pop();
  54.         v2 = qSymbols.top();
  55.         qSymbols.pop();
  56.         int childNum = vertex.size();
  57.         vertex[v1.second].second = childNum; // ставим индекс ребенка для обоих родителей
  58.         vertex[v2.second].second = childNum;
  59.         vertex.push_back(make_pair(v1.first + v2.first, -1));
  60.         qSymbols.push(make_pair(v1.first + v2.first, childNum));
  61.     }
  62.     long long sum = 0;
  63.     for(int i = 0; i < vertex.size() - 1; i++)
  64.     {
  65.         sum += vertex[i].first;
  66.     }
  67.     cout << sum;
  68.     return 0;
  69. }
  70.  
  71. /*
  72.  
  73. -------------
  74. AAABCCD
  75.  
  76. 13
  77. ---------------------
  78. AaaaAaaaABbbCccCxD
  79.  
  80. 50
  81. ------------------
  82. AAaaBBbbCcccDdddEEEeeeFG
  83. 84
  84. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement