关注
#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; }
查看原帖
点赞 评论
相关推荐
01-08 09:52
门头沟学院 Java
christina2...:楼主你应该问毕业前什么时候能签三方,签三方就代表着给你预留了这个岗位,毕业后直接正式入职。转正答辩拿到正式offer一般都是会签三方的,图片这个HR好像没有三方的概念。 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# xx岗简历求拷打 #
5475次浏览 61人参与
# 掌握什么AI技能,会为你的求职大大加分 #
5459次浏览 235人参与
# 有转正机会的小厂实习值得去吗? #
6997次浏览 79人参与
# 牛客租房专区 #
160877次浏览 1941人参与
# 开工第一帖 #
18417次浏览 345人参与
# 携程求职进展汇总 #
885631次浏览 5821人参与
# 求职季如何保持心态不崩 #
210587次浏览 1442人参与
# 你最讨厌面试被问什么 #
7333次浏览 93人参与
# 金三银四,你有感觉到吗 #
693007次浏览 6088人参与
# 哪些公司开春招了? #
33752次浏览 206人参与
# 你学到的“最没用”的职场技能是 #
20293次浏览 154人参与
# 找工作时的取与舍 #
122748次浏览 877人参与
# 秋招提前批,你开始投了吗 #
718123次浏览 8443人参与
# 面试反问你会问什么 #
167423次浏览 1719人参与
# 应届生,你找到工作了吗 #
107651次浏览 626人参与
# 毕业季等于分手季吗 #
54974次浏览 654人参与
# 工作不开心辞职是唯一出路吗 #
8670次浏览 33人参与
# 大家每天通勤多久? #
90183次浏览 1014人参与
# 面试题刺客退退退 #
534416次浏览 7527人参与
# 工作中哪个瞬间让你想离职 #
123580次浏览 805人参与
卓越教育公司福利 132人发布