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

import Control.Applicative
import Control.Monad
import Control.Monad.ST
import qualified Data.ByteString as BS
import Data.Functor
import Data.Function
import Data.Monoid
import Data.Maybe
import Data.List
import qualified Data.Foldable as Foldable
import qualified Data.Set as Set
--import qualified Data.Sequence as Sequence
import Data.List.Split
import Data.Bits
import Data.Char
import Data.Ix
import Data.Ratio
import Data.Ord
import Data.Tuple
--import Data.Array
--import Data.Array.Unboxed
import Data.Array.IArray
import Data.Array.MArray
import Data.Array.IO
import Data.Array.ST
import Data.IORef
import Data.STRef
-- import System.IO.Unsafe

-- templete
readInt = read :: String -> Int
readInteger = read :: String -> Integer
readDouble = read :: String -> Double
getInt = readLn :: IO Int
getInts = map readInt . words <$> getLine
getInteger = readLn :: IO Integer
getIntegers = map readInteger . words <$> getLine
getDouble = readLn :: IO Double
sjoin :: (Show a) => [a] -> String
sjoin = unwords . map show
cond :: a -> a -> Bool -> a
cond t f c = if c then t else f
apply2 :: (a -> a -> b) -> [a] -> b
apply2 f [x,y] = f x y
apply3 :: (a -> a -> a -> b) -> [a] -> b
apply3 f [x,y,z] = f x y z
apply4 :: (a -> a -> a -> a -> b) -> [a] -> b
apply4 f [x,y,z,w] = f x y z w
fnTuple :: (a -> b, a -> c) -> a -> (b, c)
fnTuple (f,g) a = (f a, g a)
replace :: (Eq a) => a -> a -> [a] -> [a]
replace x y = map (\z -> if z==x then y else z)
binMap :: (a -> a -> b) -> [a] -> [b]
binMap f (x:xs@(y:_)) = f x y : binMap f xs
binMap _ _ = []
splitRec :: Int -> [a] -> [[a]]
splitRec _ [] = []
splitRec n xs = let (y,ys) = splitAt n xs in y : splitRec n ys
infixl 7 `divCeil`
divCeil :: Integral a => a -> a -> a
x `divCeil` y = (x+y-1) `div` y
coverC :: Ord a => (a, a) -> a -> Bool
coverC (l,r) x = l<=x && x<=r
coverH :: Ord a => (a, a) -> a -> Bool
coverH (l,r) x = l<=x && x<r
-- templete

b 'A' = [0,0,0,0,0]
b 'B' = [0,0,0,0,1]
b 'C' = [0,0,0,1,0]
b 'D' = [0,0,0,1,1]
b 'E' = [0,0,1,0,0]
b 'F' = [0,0,1,0,1]
b 'G' = [0,0,1,1,0]
b 'H' = [0,0,1,1,1]
b 'I' = [0,1,0,0,0]
b 'J' = [0,1,0,0,1]
b 'K' = [0,1,0,1,0]
b 'L' = [0,1,0,1,1]
b 'M' = [0,1,1,0,0]
b 'N' = [0,1,1,0,1]
b 'O' = [0,1,1,1,0]
b 'P' = [0,1,1,1,1]
b 'Q' = [1,0,0,0,0]
b 'R' = [1,0,0,0,1]
b 'S' = [1,0,0,1,0]
b 'T' = [1,0,0,1,1]
b 'U' = [1,0,1,0,0]
b 'V' = [1,0,1,0,1]
b 'W' = [1,0,1,1,0]
b 'X' = [1,0,1,1,1]
b 'Y' = [1,1,0,0,0]
b 'Z' = [1,1,0,0,1]
b ' ' = [1,1,0,1,0]
b '.' = [1,1,0,1,1]
b ',' = [1,1,1,0,0]
b '-' = [1,1,1,0,1]
b '\'' =[1,1,1,1,0]
b '?' = [1,1,1,1,1]
toBin s = concat $ map b s

d (1:0:1:s) = ' ' : d s
d (0:0:0:0:0:0:s) = '\'' : d s
d (0:0:0:0:1:1:s) = ',' : d s
d (1:0:0:1:0:0:0:1:s) = '-' : d s
d (0:1:0:0:0:1:s) = '.' : d s
d (0:0:0:0:0:1:s) = '?' : d s
d (1:0:0:1:0:1:s) = 'A' : d s
d (1:0:0:1:1:0:1:0:s) = 'B' : d s
d (0:1:0:1:s) = 'C' : d s
d (0:0:0:1:s) = 'D' : d s
d (1:1:0:s) = 'E' : d s
d (0:1:0:0:1:s) = 'F' : d s
d (1:0:0:1:1:0:1:1:s) = 'G' : d s
d (0:1:0:0:0:0:s) = 'H' : d s
d (0:1:1:1:s) = 'I' : d s
d (1:0:0:1:1:0:0:0:s) = 'J' : d s
d (0:1:1:0:s) = 'K' : d s
d (0:0:1:0:0:s) = 'L' : d s
d (1:0:0:1:1:0:0:1:s) = 'M' : d s
d (1:0:0:1:1:1:1:0:s) = 'N' : d s
d (0:0:1:0:1:s) = 'O' : d s
d (1:1:1:s) = 'P' : d s
d (1:0:0:1:1:1:1:1:s) = 'Q' : d s
d (1:0:0:0:s) = 'R' : d s
d (0:0:1:1:0:s) = 'S' : d s
d (0:0:1:1:1:s) = 'T' : d s
d (1:0:0:1:1:1:0:0:s) = 'U' : d s
d (1:0:0:1:1:1:0:1:s) = 'V' : d s
d (0:0:0:0:1:0:s) = 'W' : d s
d (1:0:0:1:0:0:1:0:s) = 'X' : d s
d (1:0:0:1:0:0:1:1:s) = 'Y' : d s
d (1:0:0:1:0:0:0:0:s) = 'Z' : d s
d _ = []

main = lines <$> getContents >>= mapM_ (putStrLn . d . toBin)