「プログラミングの課題(プログラミングコンテストトレーニングマニュアル)」は、おそらくアルゴリズムに関する最も優れた演習の本の1つです。最初の11の演習を解決しましたが、「CryptKicker」の問題で立ち往生しています。
Crypt Kicker
テキストを暗号化する一般的ですが安全でない方法は、アルファベットの文字を並べ替えることです。言い換えると、アルファベットの各文字は、テキスト内で一貫して他の文字に置き換えられます。暗号化を元に戻せるようにするために、2つの文字が同じ文字に置き換えられることはありません。あなたの仕事は、各行が異なる置換のセットを使用し、復号化されたテキスト内のすべての単語が既知の単語の辞書からのものであると仮定して、テキストのいくつかのエンコードされた行を復号化することです。
入力
入力は、整数nを含む行と、それに続くn個の小文字(行ごとに1つ)で構成され、アルファベット順になります。これらのn個の単語は、復号化されたテキストに表示される可能性のある単語の辞書を構成します。
辞書に続いて、数行の入力があります。各行は上記のように暗号化されます。辞書には1,000語しかありません。16文字を超える単語はありません。暗号化された行には小文字とスペースのみが含まれ、長さは80文字を超えません。
出力
各行を復号化し、標準出力に出力します。複数の解決策がある場合は、誰でもかまいません。
解決策がない場合は、アルファベットのすべての文字をアスタリスクに置き換えてください。サンプル入力6
と
ディック
ジェーン
パフ
スポット
ヤートルbjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn
xxxx yyy zzzz www yyyy aaa bbbb ccc ddddddサンプル出力
ディックとジェーンとパフとスポットとヤートル..。
この演習を解決するには、どのような戦略を取る必要がありますか?私は古典的で野蛮なバックトラックソリューションを考えていましたが、もっとインテリジェントなものが見つかるまでそれを避けようとしています。
PS:これは宿題とは関係ありません。私は自分の全体的なスキルを向上させようとしているだけです。