HDU1053

裸的huffuman树,其实可以卜建树,对于新手来说多练吧也是好的


注意优先队列的使用,因为使用动态的。。。。优先队列对指针部分开始怎么也排不了序。后来查了下,发现这个特殊的用法,Mark下


struct cmp
{
    bool operator()(node * a,node * b)
    {
        return a->f>b->f;
    }
};
priority_queue<node*,vector<node*>,cmp>pq;

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <stdlib.h>
using namespace std;
int sum;
struct node
{
    int f;
    node *l;
    node *r;
    bool operator <(node *a)
    {
        return f>a->f;
    }
};
struct cmp
{
    bool operator()(node * a,node * b)
    {
        return a->f>b->f;
    }
};
node *root;
void buildTree(int a[])
{
    priority_queue<node*,vector<node*>,cmp>pq;

    for(int i=0;i<27;i++)
    {
        if(a[i])
        {
            node *n=(node *)malloc(sizeof(node));
            n->f=a[i];
            n->l=NULL;
            n->r=NULL;
            pq.push(n);
        }
    }
    while(pq.size()>1)
    {
        node *l=pq.top();
        pq.pop();
        node *r=pq.top();
        pq.pop();
        node *p=(node *)malloc(sizeof(node));
        p->l=l;
        p->r=r;
        p->f=l->f+r->f;
        pq.push(p);
    }
    root=pq.top();
    //cout<<root->f<<endl;
    pq.pop();
}

void dfs(node *p,int l)
{
    if(!p->l&&!p->r)
    {
        //cout<<l<<endl;
        sum+=p->f*l;
        return;
    }
    if(p->l)dfs(p->l,l+1);
    if(p->r)dfs(p->r,l+1);
}

int main()
{
    //freopen("t.txt","r",stdin);
    char str[1000];
    int a[27],flag;
    while(scanf("%s",str)!=EOF&&strcmp(str,"END"))
    {
        flag=0;
        //cout<<str<<endl;
        sum=0;
        memset(a,0,sizeof(a));
        int len=strlen(str);
        for(int i=0;i<len;i++)
        {
            if(str[i]=='_')a[26]++;
            else a[str[i]-'A']++;
        }
        for(int i=0;i<27;i++)if(a[i])flag++;
        buildTree(a);
        if(flag==1)sum=len;
        else dfs(root,0);
        printf("%d %d %.1lf\n",len*8,sum,len*8*1.0/sum);
    }
    return 0;
}


你可能感兴趣的:(HDU1053)