G - Strange Mirroring Editorial by evima

直接的な実装

公式解説の「これを \(B=0\) になるまで辿ることでもこの問題に正解できますが」の再帰関数による実装です。)

\(S\) の長さを \(N\) とし、\(S\) に問題文中の操作を \(l\) 回施して得られる文字列をレベル \(l\) の文字列と呼びます。操作を行うたびに文字列の長さが倍になるため、レベル \(l\) の文字列の長さは \(2^l \times N\) であり、\(K_i \leq 10^{18}\) という制約を考慮するとレベル \(60\) の文字列を考えれば十分です。

レベル \(0\) の文字列の \(k\) 文字目は \(S\)\(k\) 文字目です。

レベル \(l\)\(l \geq 1\))の文字列の \(k\) 文字目は、この文字列の前半がレベル \(l-1\) の文字列と一致して後半がその文字列の大文字小文字を入れ替えたものであることに注意すると以下の通りです。

  • \(k \leq 2^l \times N\) なら、レベル \(l-1\) の文字列の \(k\) 文字目
  • そうでないなら、レベル \(l-1\) の文字列の \(k-2^{l-1} \times N\) 文字目の大文字小文字を入れ替えたもの

これは再帰関数としてそのまま実装できます。

実装例(Python)

S = input()
Q = int(input())
K = map(int, input().split())


def f(k, l):
    if l == 0:
        return S[k - 1]
    h = len(S) << (l - 1)
    if k <= h:
        return f(k, l - 1)
    return chr(ord(f(k - h, l - 1)) ^ 32)


for k in K:
    print(f(k, 60), end=" ")

posted:
last update: