【ABC199 C】「IPFL」を解く【Python3】

コンテスト一覧へ

 

長さ2Nの文字列Sに対して、Q個のクエリを与えた後の文字列S’を出力する問題です。

提出
n = int(input())
s = list(input())
q = int(input())

flag = False
for i in range(q):
    t, a, b = map(int, input().split())
    if t == 1:
        if flag:
            if a=n:
                a += n
                b -= n
            elif a>=n and b>=n:
                a -= n
                b -= n
        sa = s[a-1]
        sb = s[b-1]
        s[a-1] = sb
        s[b-1] = sa
    else:
        flag = not flag

ans = "".join(s)
if flag:
    ans = ans[n:]+ans[:n]

print(ans)

T=2 のときに、前半N文字と後半N文字を入れ替える、とあるのですが、これをそのまま実装すると時間がかかってしまうため、工夫する必要があります。

ということで「flag」という変数を作って、反転していない状態を「False」、反転している状態を「True」として、今現在どの状態なのか分かるようにしておきます。

flag = not flag

とし、反転の処理を行います。

 

T=1 のときに、A文字目とB文字目を入れ替えます。

「flag=False」のときは反転していないので、そのままの入れ替えで問題ないです。

「True」のときは、単純に「A文字目とB文字目」とはならないので、何文字目なのかを計算します。

AがNより小さいときは、反転で「A+N」文字目となり、N以上のときは、反転で「A-N」文字目となります。

これをA,Bともに、場合分けして事前に計算しておき、A’文字目とB’文字目を入れ替えます。

(インデックスは0から始まるので、-1を忘れずに)

すべてのクエリを処理した後は、反転しているかどうかを判定して、「flag=True」の場合は、反転したものを出力します。

【ABC199】解説記事リスト

コンテスト一覧に戻る

コメントを残す

メールアドレスが公開されることはありません。