nyoj 801 Haffman符号化
7233 ワード
Haffmanコード
時間制限:
1000 ms|メモリ制限:
65535 KB
難易度:
3
説明
ハフマンコードは皆さんおなじみでしょう(詳しくなくても大丈夫、自分で調べます...).文字列と対応する重み値を与えて、ハフマンツリーを構築して、各文字のハフマン符号化を決定します.もちろん、ここにはいくつかの小さな規定があります.
1.ハフマンツリーの左サブツリー符号化を0、右サブツリー符号化を1とする.
2.両方の文字の重み値が同じであれば、ASCIIコードの値が小さい文字は左の子供、大きい文字は右の子供である.
3.作成された新しいノードが表す文字は、その左の子供の文字と同じです.
4.すべての文字はASCIIコードテーブル上の32-96の間の文字(すなわち「」から「`」の間の文字)である.
入力
複数のデータを含む入力(100を超えない)
各グループのデータの最初の行には整数nがあり、文字の個数を表す.次にn行、各行に1文字chと整数weightがあり、文字chに対応する重み値を表し、中間をスペースで区切る.
入力データは、各テストデータの文字が重複しないことを保証します.
しゅつりょく
各テストデータのセットについて、対応する文字およびそれらのハーバーマン符号化結果を入力順に出力し、具体的なフォーマットはサンプルを参照してください.
サンプル入力
3
a 10
b 5
c 8
4
a 1
b 1
c 1
d 1
サンプル出力
a:0
b:10
c:11
a:00
b:01
c:10
d:11
分析:
万悪のハフマン、全く理解していません.私はいつそれを明らかにすることができますか.では、変数、そんなに多くの変化があります.
データ構造がどうしてこんなに難しいのか分からない.
写したコードですが、保存しておきますので、後でしっかり検討できるように
001.
#include<stdio.h>
002.
#include<string.h>
003.
#include<algorithm>
004.
#define INF 99999999;
005.
using
namespace
std;
006.
struct
f
007.
{
008.
char
ch,*str;
009.
int
w,p,l,r;
010.
} num[200];
011.
int
main()
012.
{
013.
int
m,n,min1,min2,s1,s2,i,j,s,c,q;
014.
char
*cd;
015.
while
(
scanf
(
"%d"
,&n)!=EOF)
016.
{
017.
for
(i=1; i<=n; i++)
018.
{
019.
getchar
();
020.
scanf
(
"%c%d"
,&num[i].ch,&num[i].w);
021.
num[i].p=num[i].l=num[i].r=0;
022.
}
023.
m=2*n;
024.
for
(i=n+1; i<m; i++)
025.
num[i].w=num[i].p=num[i].l=num[i].r=0;
026.
//
027.
for
(i=n+1; i<m; i++)
028.
{
029.
min1=min2=INF;
030.
s1=s2=0;
031.
for
(j=1; j<=i-1; j++)
032.
{
033.
034.
if
(num[j].p!=0)
035.
continue
;
036.
if
(min1>num[j].w)
037.
{
038.
min2=min1;
039.
min1=num[j].w;
040.
s2=s1;
041.
s1=j;
042.
}
043.
else
if
(min1==num[j].w&&num[s1].ch>num[j].ch)
044.
{
045.
min2=min1;
046.
min1=num[j].w;
047.
s2=s1;
048.
s1=j;
049.
}
050.
else
if
(min2>num[j].w)
051.
{
052.
min2=num[j].w;
053.
s2=j;
054.
}
055.
else
if
(min2==num[j].w&&num[s2].ch>num[j].ch)
056.
{
057.
min2=num[j].w;
058.
s2=j;
059.
}
060.
}
061.
num[i].w=num[s1].w+num[s2].w;
062.
num[s1].p=i;
063.
num[s2].p=i;
064.
if
(num[s1].w==num[s2].w)
065.
{
066.
if
(num[s1].ch>num[s2].ch)
067.
{
068.
num[i].ch=num[s2].ch;
069.
num[i].l=s2;
070.
num[i].r=s1;
071.
}
072.
if
(num[s1].ch<num[s2].ch)
073.
{
074.
num[i].ch=num[s1].ch;
075.
num[i].l=s1;
076.
num[i].r=s2;
077.
}
078.
}
079.
else
080.
{
081.
num[i].ch=num[s1].ch;
082.
num[i].l=s1;
083.
num[i].r=s2;
084.
}
085.
}
086.
cd=(
char
*)
malloc
(n*
sizeof
(
char
));
087.
cd[n-1]=
'\0'
;
088.
for
(i=1; i<=n; i++)
089.
{
090.
s=n-1;
091.
c=i;
092.
q=num[i].p;
093.
while
(q!=0)
094.
{
095.
--s;
096.
if
(num[q].l==c)
097.
cd[s]=
'0'
;
098.
else
099.
cd[s]=
'1'
;
100.
c=q;
101.
q=num[q].p;
102.
}
103.
num[i].str=(
char
*)
malloc
((n-s)*
sizeof
(
char
));
104.
strcpy
(num[i].str,&cd[s]);
105.
}
106.
free
(cd);
107.
for
(i=1; i<=n; i++)
108.
printf
(
"%c:%s
"
,num[i].ch,num[i].str);
109.
}
110.
return
0;
111.
}