難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Two Records

作成者 mackerel38

テスター yukimy32

難易度(作成者設定) Lv.5

難易度(投票) 未投票 (0票)

実行時間制限
2 秒
メモリ制限
512 MiB

解説

操作ごとの rr の値を順に並べた列を AA とする。

AA を前半と後半に分け、それぞれの長さを ⌊N2⌋,⌈N2⌉\left\lfloor\dfrac{N}{2}\right\rfloor, \left\lceil\dfrac{N}{2}\right\rceil とする。

前半の各項を S,TS, T に追加する組み合わせ 2⌊N2⌋2^{\left\lfloor\frac{N}{2}\right\rfloor} 通りを全列挙する。前半の操作後の文字列をそれぞれ S1,T1S_1, T_1 とする。すべての操作後に S=TS = T となるためには、 S,TS, T のうち短い方が長い方の接頭辞である必要がある。

∣T1∣<∣S1∣|T_1| \lt |S_1| の場合を考える。このとき、文字列 UU を用いて S1=T1+US_1 = T_1 + U と表せる。

後半の操作で S,TS, T に追加される文字列をそれぞれ S2,T2S_2, T_2 とすると、

S1+S2=T1+T2  ⟺  U+S2=T2S_1 + S_2 = T_1 + T_2 \iff U + S_2 = T_2

が成り立つ。 したがって、後半の操作では、 U,S2U, S_2 がそれぞれ T2T_2 の接頭辞、接尾辞であるようなものを探せば良い。

∣S1∣≤∣T1∣|S_1| \le |T_1| のときも同じようにして考えることができる。

前半、後半で 2⌊N2⌋,2⌈N2⌉2^{\left\lfloor\frac{N}{2}\right\rfloor}, 2^{\left\lceil\frac{N}{2}\right\rceil} 通り をそれぞれ半分全列挙し、map などを用いて出現回数を記録して S=TS=T となるような組を足し合わせることで答えが得られる。

N=⌊log⁡3X⌋+1N = \left\lfloor\log_3{X}\right\rfloor + 1 なので、計算量 O(N22⌊N2⌋)=O(Xlog⁡32(log⁡X)2)O\left(N^22^{\left\lfloor\frac{N}{2}\right\rfloor}\right) = O\left(X^{\log_3{\sqrt2}}(\log{X})^2\right) などでこの問題を解くことができる。なお、 N≤38N \le 38 である。

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。