Official

E - Reverse Permutation Editorial by sounansya


まず、操作を以下のように言い換えます。

  • \(A=()\) とする。
  • \(k=1,2,\ldots,N\) に対し、以下の操作を行う:
    • \(A\) の末尾に \(k\) を追加する。
    • \(S_k=\) o の場合、\(A\) を反転する。

また、反転した回数 \(c\) を保存すると、毎回反転するのではなく最後にまとめて反転することで以下のようにして \(A\) を求めることができます:

  • \(A=(),c=0\) とする。
  • \(k=1,2,\ldots,N\) に対し、以下の操作を行う:
    • \(c\) が偶数なら \(A\) の末尾に、奇数なら \(A\) の先頭に \(k\) を追加する。
    • \(S_k=\) o の場合、\(c\) に \(1\) 加算する。
  • \(c\) が奇数の場合、\(A\) を反転する。

このアルゴリズムは先頭に追加した要素を別の配列として保持するなどして \(O(N)\) 時間で動作します。

以上を適切に実装することでこの問題に正答することができます。

実装例(Python3)

n = int(input())
s = input()
a, b = [], []
rev = False
for i in range(n):
    if rev:
        a.append(i + 1)
    else:
        b.append(i + 1)
    if s[i] == "o":
        rev ^= True
ans = a[::-1] + b
if rev:
    ans = ans[::-1]
print(*ans)

posted:
last update: