关注
#include <iostream> #include <queue> #include <map> #include <climits> // for CHAR_BIT #include <iterator> #include <algorithm> #include <vector> #include <string> using namespace std; const int UniqueSymbols = 1 << CHAR_BIT; string SampleString; typedef std::vector<bool> HuffCode; typedef std::map<char, HuffCode> HuffCodeMap; class INode { public: const int f; virtual ~INode() {} protected: INode(int f) : f(f) {} }; class InternalNode : public INode { public: INode *const left; INode *const right; InternalNode(INode* c0, INode* c1) : INode(c0->f + c1->f), left(c0), right(c1) {} ~InternalNode() { delete left; delete right; } }; class LeafNode : public INode { public: const char c; LeafNode(int f, char c) : INode(f), c(c) {} }; struct NodeCmp { bool operator()(const INode* lhs, const INode* rhs) const { return lhs->f > rhs->f; } }; INode* BuildTree(const int(&frequencies)[UniqueSymbols]) { std::priority_queue<INode*, std::vector<INode*>, NodeCmp> trees; for (int i = 0; i < UniqueSymbols; ++i) { if (frequencies[i] != 0) trees.push(new LeafNode(frequencies[i], (char)i)); } while (trees.size() > 1) { INode* childR = trees.top(); trees.pop(); INode* childL = trees.top(); trees.pop(); INode* parent = new InternalNode(childR, childL); trees.push(parent); } return trees.top(); } void GenerateCodes(const INode* node, const HuffCode& prefix, HuffCodeMap& outCodes) { if (const LeafNode* lf = dynamic_cast<const LeafNode*>(node)) { outCodes[lf->c] = prefix; } else if (const InternalNode* in = dynamic_cast<const InternalNode*>(node)) { HuffCode leftPrefix = prefix; leftPrefix.push_back(false); GenerateCodes(in->left, leftPrefix, outCodes); HuffCode rightPrefix = prefix; rightPrefix.push_back(true); GenerateCodes(in->right, rightPrefix, outCodes); } } int main() { // Build frequency table int frequencies[UniqueSymbols] = { 0 }; std::cin >> SampleString; for (int i = 0; i < SampleString.size(); i++) { if(SampleString[i] != '\0') ++frequencies[SampleString[i]]; } INode* root = BuildTree(frequencies); HuffCodeMap codes; GenerateCodes(root, HuffCode(), codes); delete root; for (int i = 0; i < SampleString.size(); i++) { for (HuffCodeMap::const_iterator it = codes.begin(); it != codes.end(); ++it) { if(it->first== SampleString[i]) std::copy(it->second.begin(), it->second.end(), std::ostream_iterator<bool>(std::cout)); } } std::cout << std::endl; return 0; }
查看原帖
点赞 评论
相关推荐
一表renzha:
哈哈哈,看过一个段子,随机选一半简历丢进垃圾桶,然后说运气不好的同学是干不了投行的
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 如何准备秋招 #
8715次浏览 153人参与
# 软开人,秋招你打算投哪些公司呢 #
100397次浏览 941人参与
# 现代汽车前瞻技术研发急速编程挑战赛 #
21318次浏览 182人参与
# 你觉得实习能学到东西吗 #
12532次浏览 306人参与
# 秋招什么时候开投比较合适? #
5178次浏览 113人参与
# 实习,不懂就问 #
24501次浏览 376人参与
# 每个月的工资都是怎么分配的? #
12116次浏览 273人参与
# 你觉得现在还能进互联网吗? #
3920次浏览 91人参与
# 技术岗笔试题求解 #
75278次浏览 974人参与
# 预测一下26届秋招形势 #
20119次浏览 210人参与
# 你最近一次加班是什么时候? #
67602次浏览 346人参与
# 高考出分的那一天,我__ #
13935次浏览 232人参与
# 打工人的精神状态 #
53263次浏览 967人参与
# 米哈游工作体验 #
17504次浏览 116人参与
# 机械实习一天多少钱合适? #
28711次浏览 176人参与
# 你觉得实习只能是打杂吗? #
191985次浏览 1211人参与
# 聊聊你的职场新体验 #
161129次浏览 1391人参与
# 来聊聊你认为的薪资天花板是哪家? #
30666次浏览 174人参与
# 安利/避雷我的专业 #
75821次浏览 522人参与
# 牛客十周岁生日快乐 #
144820次浏览 1609人参与
# 你们公司几号发工资 #
18672次浏览 116人参与