ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC126 F - XOR Matching

問題
提出コード

解法

  • M=1の場合
    K=0ならば0 \  0 \ 1 \  1もしくは0 \  1 \ 1 \  0もしくは1 \  0 \  0 \  1を出力すればよく、それ以外ならば-1を出力します。

  • それ以外の場合
    K \geqq 2^{M}の場合、数列に含まれる数字は2^{M}-1までの関係で、どう頑張ってもKを作成することができないので答えは-1になります。
    そうでない場合、
    0, 1, 2, ... K-1, K+1, ... 2^{M}-1, K, 2^{M}-1, ... K+1, K-1, ... 2, 1, 0, K
    という数列を作成することで問題の条件を満たします。
    まず、挟み込んでいる2つの数字a_{i},a_{j}については、それらでxorを取った時点で打ち消しあって0になるので、考えなくてよいです。
    0から2^{M}-1の全ての数字についてのxorを取ると、全ての桁について、立っているビットは全体の半分で偶数であり、結局は0になります。
    そこからある数Xについてのxorだけを取らないことを考えると、これは0Xについてのxorを取ることと変わらないため、結局Xになります。
    ということは、2つのKで挟み込まれている部分のxorがKとなるには、K以外の[0,2^{M})についてのxorを取っていればよく、逆にK以外の数字で挟みこまれている部分のxorがKになるには、Kを1つだけ用意しておいて、それ以外の数字についてのxorが0になっていればよいので、上のような数列を用意してあげればよいことになります。

    感想

    せっかく考察がはやく終わったのに、デバッグに1時間ぐらいかかったうえ、結局バグはサンプルケース(M = 1の部分)だったということに気づいたのが終了数分前でした。
    ACできる考察を用意する前では、コーナーケースとして処理していたのですが、ACできる考察のコードに、その処理を記述し忘れていました…
    この手のバグ取りに時間をかけてしまう(+サンプルを通さない)のはよくない気がしているので気を付けたいですね。