1022-哈夫曼编码与译码

描述

已知电文包括的字符集为{ACIMNPTU},输入对应权值,对字符集合进行哈夫曼编码,完成电文的哈夫曼编码与译码工作。

输入

 

共三行:

第一行为对应字符集{ACIMNPTU}的权值

第二行为一段字符串表示的电文(长度不超过1000);

第三行为一段电文的哈夫曼编码。

 

输出

 

共十行:

前八行为各字符的编码;

第九行是与第二行输入对应的哈夫曼编码;

第十行是与第三行输入对应的电文。

 

样例输入

1 2 3 4 5 6 7 8

NUPTICPCACM

1111011111100

样例输出

A: 11110

C: 11111

I: 1110

M: 100

N: 101

P: 110

T: 00

U: 01

1010111000111011111110111111111011111100

ACM

#include<iostream>

#include<queue>

#include<string>

using namespace std;

#define MAX 10





char str[8]={'A','C','I','M','N','P','T','U'};

int temp[MAX*3];

int str2[256][MAX*3];

string str3;



class node

{

    public:

    int k;

    char c;

    node *l,*r;

    node()

    {

        c='0';

        k=0;r=l=NULL;

    }

    node(int a,char s)

    {

        k=a;r=l=NULL;

        c=s;

    }

    friend node* uni(node *p,node *q)

    {

        node *temp=new node(p->k+q->k,'0');

        temp->l=p;

        temp->r=q;

        return temp;

    }

};

void prim(node *p,int L)

{

    if(!p->r)

    {

        str2[p->c][0]=L;

        for(int i=1;i<=L;i++)

        {

            str2[p->c][i]=temp[i-1];

        }

    }

    else

    {

        temp[L]=0;

        prim(p->l,L+1);

        temp[L]=1;

        prim(p->r,L+1);

    }

}



class nodeCmp

{

public:

    bool operator()(node* p1, node* p2) const

    {

        return p1->k > p2->k;

    }

};

node *s[MAX*3];

priority_queue<node *,deque<node *>,nodeCmp> pro_queue;

int main()

{

    //freopen("a.txt","r",stdin);

    int i,a;

    for(i=0;i<8;i++)

    {

        cin>>a;

        node *p;

        p=new node(a,str[i]);

        s[i]=p;

        pro_queue.push(s[i]);

    }

    while(pro_queue.size()>1)

    {

        node *p,*q,*k;

        p=pro_queue.top();

        pro_queue.pop();

        q=pro_queue.top();

        pro_queue.pop();

        k=uni(p,q);

        pro_queue.push(k);

        }

        node *p=pro_queue.top();

        prim(p,0);

        for(i=0;i<8;i++)

        {

            cout<<str[i]<<": ";

            for(int j=1;j<=str2[str[i]][0];j++)

            {

                cout<<str2[str[i]][j];

                }

                cout<<endl;

            }

            cin>>str3;

            int len=str3.length();

            for(i=0;i<len;i++)

            {

                for(int j=1;j<=str2[str3[i]][0];j++)

                {

                cout<<str2[str3[i]][j];

                }

            }

            cout<<endl;

            cin>>str3;

            len=str3.length();

            node *q=pro_queue.top();

            for(i=0;i<len;i++)

            {



                if(str3[i]=='1')

                {

                q=q->r;

                }

                else

                {

                q=q->l;

                }

                if(q->c!='0')

                {

                cout<<q->c;

                q=pro_queue.top();

                }

            }

            cout<<endl;

    return 0;

    }

  

你可能感兴趣的:(编码)