Problem:
博士の暗号

博 士 : ?D-C'KOPUA

ピーター : どうしたんですか、デビッド博士? わけのわからないことを叫ぶのにはもう慣れましたが、
今日は文章にすらなっていませんよ。

博 士 : ほれ。

ピーター : なんですか? この表は......ああ、予選の問題にこんなのがありました。表を使って文字を置き換え
ると文字数が減るんですよね。まさか予選と本選で同じ問題を出して手を抜こうって気じゃないでし
ょうね。

博 士 : 逆じゃよ。

ピーター : 逆? なるほど、今度は短くした文字列を元に戻そうって問題ですか。ということは「?D-C'KOPUA」の
文字を、この表を使って「文字」から「符号」に置きかえるんですね......できましたよ。

11111 00011 11101 00010 11110 01010 01110 01111 10100 00000

博 士 : うむ。次はこれじゃ。

ピーター : そうそう、こんな表もありましたね。これを逆に使うんだから「符号」から「文字」に置き換えればいい
んですね。でも、最初は「11111」ですが表にありませんよ?

博 士 : そういうときは、もっと短くするか、後ろとつなげるかしてみるのだよ。

ピ ー タ ー : じゃあ短くして......あ、 「111」ならあります。じゃあ最初は「P」ですね。そうすると残りは「11」ですが、
これはぴったり合うのがないから次の「00011」から 1 文字借りて「110」にすればいいんですね。

博 士 : そうそう。つまり「E」だね。

ピ ー タ ー : それで残るのが「0011」なので、これも次から借りて「00111」にして「T」と......。全部できました。最
後の「0000」は捨てちゃえばいいんですよね?

博 士 : そうじゃ、よろしい。次はこれじゃ。

?D-C'?-C'-LMGZN?FNJKN- WEYN?P'QMRWLPZLKKTPOVRGDI

博 士 : さらにこれじゃ。

?P'QNPY?IXX?IXXK.BI -G?R'RPP'RPOVWDMW?SWUVG'-LCMGQ

博 士 : 仕上げにこうじゃ。

?P'QMDUEQ GADKOQ ?SWUVG'-LCMG?X?IGX,PUL.?UL.VNQQI

ピ ー タ ー : しっかし面倒だなあ。博士、今度は自分でプログラムを作って下さいよ。

ということで、博士のかわりに、上の文章を置き換えるプログラムを作成してください。

Input

複数のデータセットが与えられます。各データセットとして、１つの文字列（表に含まれる文字からなる 200 文字以下の文字列）が１行に与えられます。入力の終わりまで処理してください。データセットの数は 200 を超えません。

Output

各データセットごとに、変換後の文字列を１行に出力してください。

Sample Input

?D-C'KOPUA

Output for the Sample Input

PETER POTTER

Solution in C# (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;

namespace AOJ.Volume1
{
    public class DoctorsMemorableCodes
    {
        public static void Main()
        {
            var dic_bin = new Dictionary<string, int>
            {
                {"A", 0}, {"B", 1}, {"C", 2}, {"D", 3}, {"E", 4},
                {"F", 5}, {"G", 6}, {"H", 7}, {"I", 8}, {"J", 9},
                {"K", 10}, {"L", 11}, {"M", 12}, {"N", 13}, {"O", 14},
                {"P", 15}, {"Q", 16}, {"R", 17}, {"S", 18}, {"T", 19},
                {"U", 20}, {"V", 21}, {"W", 22}, {"X", 23}, {"Y", 24},
                {"Z", 25}, {" ", 26}, {".", 27}, {",", 28}, {"-", 29},
                {"'", 30}, {"?", 31}
            };

            var dic_3char = new Dictionary<string, string>
            {
                {"101", " "}, {"110", "E"}, {"111", "P"}
            };

            var dic_4char = new Dictionary<string, string>
            {
                {"0001", "D"}, {"0101", "C"}, {"0110", "K"}, {"0111", "I"}, {"1000", "R"}
            };

            var dic_5char = new Dictionary<string, string>
            {
                {"00100", "L"},
                {"00101", "O"},
                {"00110", "S"},
                {"00111", "T"},
                {"01001", "F"}
            };

            var dic_6char = new Dictionary<string, string>
            {
                {"000000", "'"},
                {"000001", "?"},
                {"000010", "W"},
                {"000011", ","},
                {"010000", "H"},
                {"010001", "."},
                {"100101", "A"}
            };

            var dic_8char = new Dictionary<string, string>
            {
                {"10010000", "Z"},
                {"10010001", "-"},
                {"10010010", "X"},
                {"10010011", "Y"},
                {"10011000", "J"},
                {"10011001", "M"},
                {"10011010", "B"},
                {"10011011", "G"},
                {"10011100", "U"},
                {"10011101", "V"},
                {"10011110", "N"},
                {"10011111", "Q"}
            };

            string input;
            while ((input = Console.ReadLine()) != null)
            {
                if (string.IsNullOrEmpty(input)) { break; }

                string binary_str = "";
                for (int i = 0; i < input.Length; i++)
                {
                    int n = dic_bin[input.Substring(i, 1)];
                    binary_str += Convert.ToString(n, 2).PadLeft(5, '0');
                }

                string answer = "";
                while (true)
                {
                    string find = "";
                    // 8文字から探す
                    if (binary_str.Length < 8) { break; }
                    find = binary_str.Substring(0, 8);
                    if (dic_8char.ContainsKey(find))
                    {
                        answer += dic_8char[find];
                        binary_str = binary_str.Substring(8);
                        continue;
                    }
                    // 6文字から探す
                    if (binary_str.Length < 6) { break; }
                    find = binary_str.Substring(0, 6);
                    if (dic_6char.ContainsKey(find))
                    {
                        answer += dic_6char[find];
                        binary_str = binary_str.Substring(6);
                        continue;
                    }
                    // 5文字から探す
                    if (binary_str.Length < 5) { break; }
                    find = binary_str.Substring(0, 5);
                    if (dic_5char.ContainsKey(find))
                    {
                        answer += dic_5char[find];
                        binary_str = binary_str.Substring(5);
                        continue;
                    }
                    // 4文字から探す
                    if (binary_str.Length < 4) { break; }
                    find = binary_str.Substring(0, 4);
                    if (dic_4char.ContainsKey(find))
                    {
                        answer += dic_4char[find];
                        binary_str = binary_str.Substring(4);
                        continue;
                    }
                    // 3文字から探す
                    if (binary_str.Length < 3) { break; }
                    find = binary_str.Substring(0, 3);
                    if (dic_3char.ContainsKey(find))
                    {
                        answer += dic_3char[find];
                        binary_str = binary_str.Substring(3);
                        continue;
                    }

                    break;
                }
                Console.WriteLine(answer);
            }
        }
    }
}