您的位置:首页 > 运维架构

UVALive - 2088 Entropy

2013-09-07 10:50 232 查看
题意:求哈夫曼编码,要求输出三个数,第一个是当字符字节是8的时候的字节总数,以及最少的,也就是经过哈夫曼编码之后的总字节数,最后是比值,采用优先队列,每次将频率最小的合并

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 5005;

struct Node{
    int l;
    int r;
    int s;
    friend bool operator <(const Node &a,const Node &b){
        return a.s > b.s;
    }
}arr[MAXN];
int vis[MAXN],len,sum;
char str[MAXN];
priority_queue<Node> Q;

void dfs(Node a,int deep){
    if (a.l == -1 && a.r == -1){
        sum += deep * a.s;
        return;
    }
    if (a.l != -1)
        dfs(arr[a.l],deep+1);
    if (a.r != -1)
        dfs(arr[a.r],deep+1);
}
void solve(){
    Node temp;
    for (int i = 0; i < 27; i++)
        if (vis[i]){
            temp.s = vis[i];
            temp.l = temp.r = -1;
            Q.push(temp);
        }

    int cur = 0;
    while (1){
        arr[cur++] = Q.top();
        Q.pop();
        if (Q.empty())
            break;
        arr[cur++] = Q.top();
        Q.pop();
        temp.s = arr[cur-1].s + arr[cur-2].s;
        temp.l = cur - 1,temp.r = cur - 2;
        Q.push(temp);
    }
    if (cur == 1)
        sum = arr[cur - 1].s;
    else dfs(arr[cur-1],0);
}
    
int main(){
    while (scanf("%s",str) != EOF){
        if (!strcmp(str,"END"))
            break;

        memset(arr,0,sizeof(arr));
        memset(vis,0,sizeof(vis));
        len = strlen(str);
        sum = 0;
        for (int i = 0; i < len; i++)
            if (str[i] == '_')
                vis[26]++;
            else vis[str[i] - 'A']++;
        
        solve();
        printf("%d %d %.1lf\n",len*8,sum,len*8.0/sum);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: