Codeforces Round #598 (Div. 3) F. Equalizing Two Strings

問題概要

長さ n の文字列 s, t が与えられる. ある長さ len を選び, 長さ len の部分列を反転させる操作を s, t の双方に行う( index はそれぞれで選んで良いが, 必ず同じ長さを反転させる必要がある).

s, t を一致させることができるか?

問題へのリンク

制約

  • 1 \le n \le 2 \times 10^5

解法

まず, 構成している文字が違う場合は明らかに NO なので, そのような場合は最初に除きます.

st に一致できるか? という問題を解く代わりに, s, t 双方に操作をすることによって両方を同じ文字列にできるか?という問題を考えましょう. 

操作の性質上隣接要素についての swap が可能なので, s, t のどちらかはソートすることができます. もし, s (及び t )が重複する文字を持っていれば, 隣接 swap を偶数回・奇数回のどちらを行うことでも文字列をソートできるので, 必然的に答えは YES になります.

逆に重複する文字がない場合, ソートするために必要な swap 回数の偶奇は文字列の転倒数の偶奇に一致することを思い出せば, s, t の転倒数の偶奇が一致しているかどうかが YES と NO を分けることがわかります.

実装

転倒数は BIT などを用いることにより効率的に計算することができますが, この問題においては転倒数を計算する必要がある文字列の長さは最大でも 26 なので, 愚直に計算すれば良いです.

Submission #147843509 - Codeforces