描述
已知电文包括的字符集为{A,C,I,M,N,P,T,U},输入对应权值,对字符集合进行哈夫曼编码,完成电文的哈夫曼编码与译码工作。
输入
共三行:
第一行为对应字符集{A,C,I,M,N,P,T,U}的权值
第二行为一段字符串表示的电文(长度不超过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;
}