关注
#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; }
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# xx岗简历求拷打 #
8894次浏览 105人参与
# 求职季如何保持心态不崩 #
212363次浏览 1459人参与
# 开工第一帖 #
29659次浏览 634人参与
# 面试反问你会问什么 #
168592次浏览 1738人参与
# 有转正机会的小厂实习值得去吗? #
8844次浏览 100人参与
# 你听到的“最没用”的秋招建议 #
51361次浏览 324人参与
# 工作不开心辞职是唯一出路吗 #
9608次浏览 40人参与
# 产品面经 #
263467次浏览 2177人参与
# 掌握什么AI技能,会为你的求职大大加分 #
7547次浏览 343人参与
# 你收到了团子的OC了吗 #
1532476次浏览 11825人参与
# 携程求职进展汇总 #
889213次浏览 5881人参与
# 远程面试的尴尬瞬间 #
328412次浏览 1917人参与
# 制造业的秋招小结 #
144820次浏览 2093人参与
# 拼多多求职进展汇总 #
848398次浏览 6593人参与
# 实习要如何选择和准备? #
145188次浏览 1566人参与
# 面试题刺客退退退 #
535298次浏览 7532人参与
# 非技术岗是怎么找实习的 #
295501次浏览 2594人参与
# 找工作时的取与舍 #
122919次浏览 878人参与
# 现在还是0offer,延毕还是备考 #
1299064次浏览 7929人参与
# 你最讨厌面试被问什么 #
8875次浏览 108人参与