POJ 1521 Entropy【哈夫曼编码】

题意: 给一个字符串,求出该字符串的哈夫曼编码的总长度。

分析:由于没考虑树中只有一个字符的情况又WA了N 久T-T  ,最近总是犯脑残的错误啊。

        关于哈夫曼编码 可以看这个....  留着复习...

        http://www.thecodeway.com/blog/?p=870

#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
#define clr(x)memset(x,0,sizeof(x))
using namespace std;
struct node
{
    double w;
    int ls,rs;
}tr[1000000];
int tot;
struct Tree
{
    int num;
    double wi;
    const bool operator < (Tree a)const{
        return a.wi<wi;
    }
}t1,t2,tt;
char s[1000000];
double v[30];
double res;
void dfs(int r,double c)
{
    if(r<=26)
    {
        res+=c*tr[r].w;
        return;
    }
    dfs(tr[r].ls,c+1);
    dfs(tr[r].rs,c+1);
}
int main()
{
    //freopen("D:ce.txt","r",stdin);
    int i,flag;
    double len,g;
    while(gets(s))
    {
        if(strcmp(s,"END")==0)
            break;
        flag=0;
        priority_queue<Tree>q;
        len=strlen(s)*8;
        printf("%.0lf ",len);
        tot=27;
        for(i=0;i<=26;i++)
            v[i]=0;

        for(i=0;s[i];i++)
        {    
            if(s[i]=='_')
                 v[26]+=1;
            else v[s[i]-'A']+=1;
        }
        for(i=0;i<=26;i++)
            if(v[i])
            {
                t1.num=i;
                t1.wi=v[i];
                q.push(t1);
                flag++;
                g=v[i];
            }
        if(flag==1)
        {
            printf("%.0lf %.1lf\n",g,len/g);
            continue;
        }
        while(q.size()!=1)
        {
            t1=q.top();
            q.pop();
            t2=q.top();
            q.pop();
            tt.num=++tot;
            tt.wi=t1.wi+t2.wi;
            q.push(tt);    
            tr[t1.num].w=t1.wi;
            tr[t2.num].w=t2.wi;
            tr[tt.num].ls=t1.num;
            tr[tt.num].rs=t2.num;
            tr[tt.num].w=tr[t1.num].w+tr[t2.num].w;
        }
        res=0;
        dfs(tot,0);
        if(len==8)
            res=1;
        printf("%.0lf %.1lf\n",res,len/res);
    }
    return 0;
}

 

posted @ 2012-07-28 12:34  'wind  阅读(233)  评论(0编辑  收藏  举报