, とする。数列全体の XOR を とする。
分割操作は、 の両端を変えずに内部へ任意の値を 1 個挿入する操作とみなせる。実際、 を に分割すると、新しい prefix XOR が と の間に入る。逆に、併合操作は内部の prefix XOR を 1 個削除する操作に対応する。
最終的な数列の長さが で、すべての要素が なら、prefix XOR は
となる。また、全体 XOR はどちらの操作でも変化しない。
の場合
は奇数であり、必ず である。したがって目標の prefix XOR は である。
元の から値が または の要素だけを残す。この列を同じ値が連続する極大区間に分け、その個数を とする。各区間から 1 個だけ残せば になる。その他の prefix XOR はすべて削除する必要があるため、答えは
である。
の場合
内部 prefix XOR のうち、 でないものの個数を とする。また、prefix XOR 列全体で隣り合う と の間にできる区間数を とする。
を選ぶ場合、 でない内部 prefix XOR をすべて削除すればよいので、コストは である。
次に を固定する。すべての の prefix XOR を残しても最適値は悪化しない。連続する 2 個の の間には、目標列で がちょうど 1 個必要である。値 を少なくとも 1 回含む区間数を とする。そのような区間では を 1 個残して削除を 1 回減らせる。一方、 を含まない区間では を 1 個挿入する必要がある。よってコストは
である。
とすれば、答えは
となる。
は左から 1 回走査して求められる。prefix XOR が になるたびに区間番号を増やす。 でない値 について、最後に数えた区間番号と、 を含む異なる区間の個数をハッシュテーブルに保存する。同じ区間に が複数回現れても 1 回だけ数えることが重要である。
期待時間計算量は 、メモリ計算量は である。
Solution written by GPT5.6