公式

C - Caesar Cipher 解説 by hint908


\(2\) つの解法を載せています。

1. 文字列を数列に変換

アルファベットで \(i\) 番目の文字を \(c_i\) とします。(\(c_1\) = a, \(c_2\) = b … です。)

このとき各文字列は \(S = c_{x_1}c_{x_2}\dots\) と表されますが、これを数列 \((x_2-x_1, x_3-x_1, \dots)\) に変換します。値が負になった場合は \(26\) を足して非負整数にします。

文字列に対してシフトを行っても上記の手順で変換した数列は一意に定まるため、どの数列と合致するか、そしてそれがどの文字列から得られたのかを高速に行うことができればよいです。

連想配列 (C++ の std::map, python の dict など)のキーを数列、要素を文字列とすればよいです。

2. 暗号文の列挙

各平文に対して暗号文の候補はちょうど \(26\) 通り存在し、これをあらかじめ列挙して連想配列(C++ の std::map, python の dict など)にまとめておくことで、各暗号文に対して平文を高速に答えることができます。

投稿日時:
最終更新: