ioi2011 logo

International Olympiad in Informatics 2011
2011年7月22-29日, タイ, パタヤ
Day 2 競技課題
日本語版

PARROTS

バージョン: 1.3

オウム (Parrots)

Yanee は鳥マニアである. Yanee は「鳥を用いた IP 通信 (IP over Avian Carriers: IPoAC)」を知った. そこで賢いオウムを訓練し, 何羽かのオウムを使って遠く離れた場所までメッセージを送ることにした.

Yanee の夢は, オウムを使って遠い遠い島にメッセージ M を送ることである. メッセージ M は, N 個の 0 以上 255 以下の整数からなる数列である (ただし, 同じ整数が含まれる可能性がある). Yanee はよく訓練された K 羽のオウムを飼育している. それぞれのオウムは 0 以上 R 以下の整数を 1 つだけ覚えることができる. ただし, オウム同士の区別はできないので, 個体を区別して整数を覚えさせることはできない.

最初, Yanee はメッセージを送る安直な方法として, 「カゴからオウムを 1 羽ずつ取り出し, それぞれのオウムにメッセージを表す数列の整数を順番に覚えさせて放つ」 という方法を考えた. しかし, 残念ながらこの方法のままではうまく送ることはできない. なぜなら, 最終的にすべてのオウムは目的地に到着するが, 放った順番に到着するとは限らないからである. この方法では, Yanee はメッセージに含まれるすべての整数を復元できるが, それらの整数を正しく並び替えることはできない.

Yanee の夢を叶えるため, より良い方法が必要であり, Yanee にはあなたの助けが必要である. メッセージ M が与えられた時, Yanee は, 先の方法と同様にオウムを 1 羽ずつ放つことを考えている. あなたは以下に示される 2 つの操作をするプログラムをそれぞれ実装する:

  1. プログラムはメッセージ M を読み, オウムに覚えさせる K 個以下の 0 以上 R 以下の整数からなる数列に符号化する.
  2. 到着したオウムが覚えていた 0 以上 R 以下の整数からなる数列を読み, 元のメッセージ M を復元する.

すべてのオウムは必ず目的地に到着し, それぞれのオウムは覚えさせられた整数を, 到着したときも正しく覚えていると仮定してよい. ただし, オウムが到着する順序は変化する可能性があることに注意せよ. また, Yanee はオウムを K 羽しか飼育していないため, あなたは K 個以下の 0 以上 R 以下の整数からなる数列に符号化しなければならない.

課題 (Your task)

全体の流れは次の図に示される通りである.

元のメッセージ 符号化
(encode)
符号化されたメッセージ シャッフル
(shuffle)
シャッフルされたメッセージ復号
(decode)
出力されたメッセージ
ME
X
(M となるべき)

以下の 2 つのプロシージャーを実装せよ. ただし, 1 つは送信用 (encode) として用いられ, もう 1 つは受信用 (decode) として用いられる.

実装の詳細 (Implementation details)

制限 (Limits)

インターフェース (API) (Interface (API))