C - Non-Adjacent Swaps

2 secs 1024 MB
uni_kakurenbo's icon uni_kakurenbo

概要

操作を繰り返すことで,文字列を自由に並べ替えることはできるか考えてみましょう.

問題原案:uni_kakurenbo

解説

まず, S=TS = T のとき明らかに Yes です.
また,SSTT とに含まれている文字とそれらの個数が一致していない場合,No です.

以下では STS \not= T かつ SSTT とが含む文字と個数は一致しているものとします.

N4N \geq 4 のとき

Yes です.

これは次のように証明できます:
文字列 1234 を操作によって 2134, 1324, 124333 通りに並べ替えることができるならば,N4N \geq 4 で任意の隣接する 22 文字を交換することが可能なので,このとき SS を任意に並び変えて S=TS = T とすることができます. (バブルソートなどを考えると明らかです.)

  • 1234 \to 4231 \to 4132 \to 2134
  • 同様に,1234 \to 1243
  • 上記を利用して,1234 \to 2143 \to 3142 \to 1324

以上より従います.

N<4N < 4 のとき

場合分けを行うことで AC を得ることができます:

  • N2N \leq 2No
  • N=3N = 3
    • S2=T2S_2 = T_2Yes
    • S2T2S_2 \not= T_2No

解説:uni_kakurenbo

実装例

C++
Python