首页 > 代码库 > 【HDOJ】1053 Entropy
【HDOJ】1053 Entropy
构造huffman编码,果断对字符进行状态压缩。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 255 8 char s[MAXN]; 9 int cnt[27], lens[27];10 11 typedef struct node_t {12 int v;13 int n;14 node_t() { }15 node_t(int vv, int nn) {16 v = vv; n = nn;17 }18 friend bool operator <(node_t a, node_t b) {19 return a.n > b.n;20 }21 } node_t;22 23 void addBits(int x) {24 for (int i=0; i<27; ++i) {25 if(x & (1<<i))26 ++lens[i];27 }28 }29 30 void bfs() {31 priority_queue<node_t> Q;32 int i;33 34 memset(cnt, 0, sizeof(cnt));35 memset(lens, 0, sizeof(lens));36 for (i=0; s[i]; ++i)37 if (s[i] == ‘_‘)38 ++cnt[26];39 else40 ++cnt[s[i]-‘A‘];41 42 for (i=0; i<27; ++i)43 if (cnt[i])44 Q.push(node_t(1<<i, cnt[i]));45 46 if (Q.size() == 1) {47 node_t a = Q.top();48 addBits(a.v);49 return ;50 }51 52 while (Q.size() > 1) {53 node_t a = Q.top();54 addBits(a.v);55 Q.pop();56 node_t b = Q.top();57 Q.pop();58 addBits(b.v);59 Q.push(node_t(a.v|b.v, a.n+b.n));60 }61 }62 63 int main() {64 int len, sum, ans;65 66 #ifndef ONLINE_JUDGE67 freopen("data.in", "r", stdin);68 #endif69 70 while (scanf("%s", s) != EOF) {71 if (strcmp(s, "END") == 0)72 break;73 bfs();74 len = strlen(s);75 sum = len<<3;76 ans = 0;77 for (int i=0; i<27; ++i)78 if (cnt[i])79 ans += cnt[i]*lens[i];80 81 printf("%d %d %.1lf\n", sum, ans, sum*1.0/ans);82 }83 84 return 0;85 }
【HDOJ】1053 Entropy
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。