時間制限 : sec, メモリ制限 : KB
English / Japanese  

ハフマン符号

与えられた文字列に出現する各文字の種類ごとに異なるビット文字列の符号語を割り当てて文字列をビット文字列へ符号化したいです。この時、どの符号語も別の符号語の接頭語とならないように符号語を割り当てると、得られたビット文字列符号から一意に元の文字列を定めることができます。

このような符号語の割り当てを求める方法の一つに、ハフマンの符号化アルゴリズムがあります。さらに、このアルゴリズムは任意の文字列について最短の自然数長ビット文字列符号をもたらすことが知られています。

例として、各文字ごとの出現頻度が以下の表のような文字列について考えます。ハフマンの符号化アルゴリズムを用いると表の3段目のような符号語を得ることができ、これが最適な符号語の割り当てとなります。

abcdef
出現頻度4513121695
符号語010110011111011100

ハフマンの符号化アルゴリズムは、以下の図のようなハフマン木と呼ばれる全二分木を構成します。

ハフマン木を構成するためには、まずそれぞれの文字の種類ごとに、文字の種類とその出現頻度を持つ親を持たない頂点を作ります。その後、手順を繰り返します。

  1. 親を持たない頂点のうち、最も出現頻度の低い2つの頂点 $x, y$ を選ぶ
  2. $x$ と $y$ の出現頻度の和を出現頻度とする新たな頂点 $z$ を作る
  3. $z$ を $x$ と $y$ の親にする
  4. 親を持たない頂点が1つなら終了.そうでないなら 1. へ戻る

ハフマン木の葉を除く各頂点の左の子への辺と右の子への辺のそれぞれに0と1を割り当てることで、根から各文字の葉へ向かうパス上に対応する符号を見て取ることができます。

課題

文字列 $S$ が入力として与えられるので、ハフマンの符号化アルゴリズムを用いて $S$ の各文字に符号語を割り当てたときに、$S$ を符号化して得られるビット文字列の長さを出力するプログラムを作成してください。

入力

$S$

文字列 $S$ が1行に与えられます。

出力

ビット文字列の長さを1行に出力してください。

制約

  • $1 \le |S| \le 10^5$
  • $S$ は英小文字からなる

入力例 1

abca

出力例 1

6

例えば上記のアルゴリズムを利用して、aに0、bに10、cに11を符号語として割り当てると、得られるビット列は010110となり、6が答えになります。

入力例 2

aaabbcccdeeeffg

出力例 2

41

入力例 3

z

出力例 3

1