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 JAVA (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Formatter;
import java.util.HashMap;

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO ?????????????????????????????????????????????
//		System.out.println(getBinary('A'));
//		System.out.println(getBinary('P'));
//		System.out.println(getBinary('Z'));
//		System.out.println(getBinary(' '));
//		System.out.println(getBinary('?'));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		TransMap tm = new TransMap();
		
		while(true){
			String str = br.readLine();

			if(str == null){
				break;
			}
			StringBuffer sb = new StringBuffer();
			for(int i = 0 ; i < str.length() ;i++){
				sb.append(getBinary(str.charAt(i)));
			}
			
			//System.out.println(sb);
			
			int start = 0;
			int end = 1;
			while(start <= sb.length() - 1 && end <= sb.length()){
				String sub = sb.substring(start, end);
				
				char tmpc = tm.translate(sub);
				if(tmpc != '\0'){
					System.out.print(tmpc);
					start = end;
					end = start + 1;
				}
				else {
					end++;
				}
			}
			System.out.println();
		}

	}

	static String getBinary(char c){
		if(c >= 'A' && c <= 'Z'){
			String tmpStr = Integer.toBinaryString(c-'A');
			if(tmpStr.length() >= 5){
				return tmpStr.substring(tmpStr.length() - 5, tmpStr.length());
			}
			else {
				Formatter fm = new Formatter();
				fm.format("%05d", Integer.parseInt(tmpStr));
				return fm.toString();
			}
		}
		
		switch (c){
		case ' ':
			return "11010";
		case '.':
			return "11011";
		case ',':
			return "11100";
		case '-':
			return "11101";
		case '\'':
			return "11110";
		case '?':
			return "11111";
			
		}
		return null;
	}
}

class TransMap {
	private HashMap<String, Character> map;
	
	public TransMap(){
		map = new HashMap<String, Character>();
		
		map.put("101", ' ');
		map.put("000000", '\'');
		map.put("000011", ',');
		map.put("10010001", '-');
		map.put("010001", '.');
		map.put("000001", '?');
		map.put("100101", 'A');
		map.put("10011010", 'B');
		map.put("0101", 'C');
		map.put("0001", 'D');
		map.put("110", 'E');
		map.put("01001", 'F');
		map.put("10011011", 'G');
		map.put("010000", 'H');
		map.put("0111", 'I');
		map.put("10011000", 'J');
		map.put("0110", 'K');
		map.put("00100", 'L');
		map.put("10011001", 'M');
		map.put("10011110", 'N');
		map.put("00101", 'O');
		map.put("111", 'P');
		map.put("10011111", 'Q');
		map.put("1000", 'R');
		map.put("00110", 'S');
		map.put("00111", 'T');
		map.put("10011100", 'U');
		map.put("10011101", 'V');
		map.put("000010", 'W');
		map.put("10010010", 'X');
		map.put("10010011", 'Y');
		map.put("10010000", 'Z');

	}
	
	public char translate(String input){
		if(map.containsKey(input)){
			return map.get(input);
		}
		
		else {
			return '\0';
		}
	}
}