DOJ logoDOJ
問題
最近追加された問題保存した問題Workbooks
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord認証を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

XOR 併合

問題に戻る

解説

P0=0P_0=0P0​=0, Pi=A1⊕A2⊕⋯⊕AiP_i=A_1\oplus A_2\oplus\cdots\oplus A_iPi​=A1​⊕A2​⊕⋯⊕Ai​ とする。数列全体の XOR を S=PNS=P_NS=PN​ とする。

分割操作は、PPP の両端を変えずに内部へ任意の値を 1 個挿入する操作とみなせる。実際、AiA_iAi​ を x,yx,yx,y に分割すると、新しい prefix XOR Pi−1⊕xP_{i-1}\oplus xP が と の間に入る。逆に、併合操作は内部の prefix XOR を 1 個削除する操作に対応する。

最終的な数列の長さが mmm で、すべての要素が kkk なら、prefix XOR は

0,k,0,k,⋯0,k,0,k,\cdots0,k,0,k,⋯

となる。また、全体 XOR SSS はどちらの操作でも変化しない。

S≠0S\ne 0S=0 の場合

mmm は奇数であり、必ず k=Sk=Sk=S である。したがって目標の prefix XOR は 0,S,0,S,⋯ ,S0,S,0,S,\cdots,S0,S,0,S,⋯,S である。

元の PPP から値が 000 または SSS の要素だけを残す。この列を同じ値が連続する極大区間に分け、その個数を CCC とする。各区間から 1 個だけ残せば 0,S,0,S,⋯ ,S0,S,0,S,\cdots,S0,S,0,S になる。その他の prefix XOR はすべて削除する必要があるため、答えは

N+1−CN+1-CN+1−C

である。

S=0S=0S=0 の場合

内部 prefix XOR P1,⋯ ,PN−1P_1,\cdots,P_{N-1}P1​,⋯,PN−1​ のうち、000 でないものの個数を とする。また、prefix XOR 列全体で隣り合う と の間にできる区間数を とする。

k=0k=0k=0 を選ぶ場合、000 でない内部 prefix XOR をすべて削除すればよいので、コストは MMM である。

次に k≠0k\ne 0k=0 を固定する。すべての 000 の prefix XOR を残しても最適値は悪化しない。連続する 2 個の 000 の間には、目標列で kkk がちょうど 1 個必要である。値 kkk を少なくとも 1 回含む区間数を とする。そのような区間では を 1 個残して削除を 1 回減らせる。一方、 を含まない区間では を 1 個挿入する必要がある。よってコストは

M−Hk+(G−Hk)=M+G−2HkM-H_k+(G-H_k)=M+G-2H_kM−Hk​+(G−Hk​

である。

H=max⁡HkH=\max H_kH=maxHk​ とすれば、答えは

min⁡(M, M+G−2H)\min(M,\ M+G-2H)min(M, M+G−2H)

となる。

HHH は左から 1 回走査して求められる。prefix XOR が 000 になるたびに区間番号を増やす。000 でない値 vvv について、最後に数えた区間番号と、vvv を含む異なる区間の個数をハッシュテーブルに保存する。同じ区間に vvv が複数回現れても 1 回だけ数えることが重要である。

期待時間計算量は O(N)O(N)O(N)、メモリ計算量は O(N)O(N)O(N) である。

Solution written by GPT5.6

i−1​
⊕
x
Pi−1P_{i-1}Pi−1​
PiP_iPi​
PiP_iPi​
,
⋯
,
S
MM
M
000
000
GGG
HkH_kHk​
kkk
kkk
kkk
)
=
M+
G−
2Hk​