記号をグラフの頂点、置換を有向辺として考えると、 頂点 辺のグラフになります。
すると、単換字式暗号の適用は、辺に沿って次の頂点へ移動することと考えられます。
これを繰返して元に戻るには、どのサイクルについても適用回数がサイクル長の倍数であることが必要です。
ただし、 に含まれない文字のみで構成されたサイクルについては無視します。
これによって、サイクル長の最小公倍数を求めることで答えが求まります。
次の つの処理を行う必要があります。
このグラフでは連結成分の大きさとサイクル長が等しくなるため、 UnionFind 木を使えば で各サイクルの長さを検出できます。
それぞれのサイクル長を素因数分解して頑張ると最小公倍数 を求めることができます。
素因数分解せず をとりながら求める方法では、正しい答えを求めることが出来ません。
多倍長整数が使える言語では、素因数分解せずに最後に 回だけ を取ると簡単です。
サイクル長の最小公倍数の最大値は が大きくなるに従って指数関数的に大きくなるため、最大ケースでは TLE します。