Description
根据传送的一串字符出现的频率,设置其相应的哈夫曼编码
Input
一串字符
Output
哈夫曼编码(按照中序遍历输出各个字母和编码,中间用冒号分开)
Sample Input
XINNNMM
Sample Output
N:0
M:10
X:110
I:111
哈夫曼树:
1.记录每个字符出现的次数,并且记录这个字符。
2.去重复字符。
3.建哈夫曼树。
4.访问输出。
注意:
相同大小时不是排字符而是排它在序列中出现的先后顺序。
type
arr=record
data:longint;
l,r:longint;
addr:longint;
zm:char;
end;
var
f,a:array [0..101] of arr;
g:array ['A'..'Z'] of longint;
i,j,t,n,sum,x:longint;
s:string;
procedure mp(k:longint);
var
i,j:longint;
t:arr;
begin
for i:=1 to k-1 do
for j:=i+1 to k do
if (a[i].data>a[j].data)
or ((a[i].data=a[j].data) and (a[i].addr>a[j].addr))
then begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
end;
procedure vist(o:string;t:longint);
begin
if f[t].data=0 then exit;
vist(o+'0',f[t].l);
vist(o+'1',f[t].r);
if f[t].l=0 then
if f[t].r=0 then writeln(f[t].zm,':',o);
end;
begin
readln(s);
for i:=1 to length(s) do inc(g[s[i]]);
for i:=1 to length(s) do
if g[s[i]]>0 then
begin
inc(n);
a[n].data:=g[s[i]];
f[n].data:=g[s[i]];
a[n].addr:=n;
a[n].zm:=s[i];
f[n].zm:=s[i];
g[s[i]]:=0;
end;
t:=n+1; i:=n;
while i>1 do
begin
mp(i);
f[t].data:=a[1].data+a[2].data;
f[t].l:=a[1].addr;
f[t].r:=a[2].addr;
a[2].zm:=a[i].zm;
a[i].zm:=chr(200);
a[1].zm:=chr(200);
a[1].data:=f[t].data;
a[1].addr:=t;
a[2].data:=a[i].data;
a[2].addr:=a[i].addr;
inc(t); dec(i);
end;
vist('',t-1);
end.