该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
/*
哈夫曼编码
Program by Alex
09-08-07 09:49
*/
#include
#include
typedef struct{
int data,lc,rc,letter;
} rec;
rec tree[18];
int code[9][9];
int amount[9],print[9],ord[9];
int len,size=8,tr_size=8;
char puff[50001];
void swap(rec &a,rec &b){
rec t=a;
a=b;
b=t;
}
void create(){
int i,j;
while(tr_size>1){
for(i=1;i
for(j=i+1;j<=tr_size;j++)
if(tree[ord[j]].data!=0 && tree[ord[j]].data>tree[ord[i]].data)
swap(tree[ord[j]],tree[ord[i]]);
size++;
tree[size].data=tree[ord[tr_size]].data+tree[ord[tr_size-1]].data;
tree[size].lc=ord[tr_size];
tree[size].rc=ord[tr_size-1];
tr_size--;
ord[tr_size]=size;
}
}
void getcode(int p,int b){
int i,k;
if(tree[p].letter!=0){
k=tree[p].letter;
printf("%c ",k-1+'A');
for(i=1;i
code[k][i]=print[i];
printf("%d",print[i]);
}
printf("\n");
code[k][0]=b-1;
return;
}
if(tree[p].lc){
print[b]=0;
getcode(tree[p].lc,b+1);
}
if(tree[p].rc){
print[b]=1;
getcode(tree[p].rc,b+1);
}
}
int main(){
int i,j,p;
freopen("encode.in","r",stdin);
freopen("encode.out","w",stdout);
gets(puff);
len=strlen(puff);
for(i=0;i
amount[puff[i]-'A'+1]++;
for(i=1;i<=8;i++){
tree[i].data=amount[i];
tree[i].letter=i;
ord[i]=i;
}
create();
getcode(ord[1],1);
for(i=0;i
p=puff[i]-'A'+1;
for(j=1;j<=code[p][0];j++)
printf("%d",code[p][j]);
}
return 0;
}