关注
#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; }
查看原帖
点赞 评论
相关推荐
06-21 01:03
门头沟学院 Java 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 工作中哪个瞬间让你想离职 #
28365次浏览 197人参与
# 在职场上,你最讨厌什么样的同事 #
16271次浏览 162人参与
# 选了这个offer,你有没有后悔? #
592975次浏览 4028人参与
# 小米硬件提前批进度交流 #
171103次浏览 1528人参与
# 哪些公司校招卡第一学历 #
74376次浏览 301人参与
# 机械人,秋招第一次笔试的企业是哪家? #
41118次浏览 327人参与
# 担心入职之后被发现很菜怎么办 #
139314次浏览 808人参与
# 入职以后才知道的校招谎言 #
88983次浏览 587人参与
# 华子oc时间线 #
1245000次浏览 6487人参与
# Offer比较,你最看重什么? #
192135次浏览 1309人参与
# 哪些公司开提前批了? #
29755次浏览 277人参与
# 风评不好的公司,你会去吗? #
65771次浏览 463人参与
# 两会劳动法放大招 #
76702次浏览 692人参与
# 实习如何「偷」产出? #
55837次浏览 1389人参与
# 职场常用语录大全 #
4066次浏览 30人参与
# 不卡学历的大厂有哪些? #
32486次浏览 246人参与
# 校招阶段,学历VS技术哪个更重要? #
19357次浏览 204人参与
# 机械人春招想让哪家公司来捞你? #
349550次浏览 3088人参与
# 除了主业以外,你还有哪些其他收入? #
13481次浏览 203人参与
# 工作丧失热情的瞬间 #
294416次浏览 2373人参与