Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <sstream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <map>
- #include <set>
- #include <stack>
- #include <list>
- #include <queue>
- #include <deque>
- #include <string>
- using namespace std;
- vector <int> symbolsNum(1000, 0);
- priority_queue <pair <int, int>, vector < pair <int, int> >, greater < pair <int, int> > > qSymbols;
- vector <pair <int, int> > vertex;
- int main()
- {
- char inp = ' ';
- while(cin.get(inp))
- {
- if(int(inp) != 10)
- {
- symbolsNum[int(inp)]++;
- }
- }
- for(int i = 0; i < 1000; i++)
- {
- if(symbolsNum[i])
- {
- vertex.push_back(make_pair(symbolsNum[i], -1));
- }
- }
- if(vertex.size() == 1) // если один символ
- {
- cout << vertex[0].first;
- return 0;
- }
- sort(vertex.begin(), vertex.end());
- for(int i = 0; i < vertex.size(); i++)
- {
- qSymbols.push(make_pair(vertex[i].first, i));
- }
- while(qSymbols.size() != 1)
- {
- pair <int, int> v1, v2;
- v1 = qSymbols.top();
- qSymbols.pop();
- v2 = qSymbols.top();
- qSymbols.pop();
- int childNum = vertex.size();
- vertex[v1.second].second = childNum; // ставим индекс ребенка для обоих родителей
- vertex[v2.second].second = childNum;
- vertex.push_back(make_pair(v1.first + v2.first, -1));
- qSymbols.push(make_pair(v1.first + v2.first, childNum));
- }
- long long sum = 0;
- for(int i = 0; i < vertex.size() - 1; i++)
- {
- sum += vertex[i].first;
- }
- cout << sum;
- return 0;
- }
- /*
- -------------
- AAABCCD
- 13
- ---------------------
- AaaaAaaaABbbCccCxD
- 50
- ------------------
- AAaaBBbbCcccDdddEEEeeeFG
- 84
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement