Codeforces 1325 D. Ehab the Xorcist_分类讨论

题意:

给出一个 Codeforces 1325 D. Ehab the Xorcist_数组_02 和一个 Codeforces 1325 D. Ehab the Xorcist_数组_03 ,要求构造出最短的一个数组,使得所有元素异或的结果为 Codeforces 1325 D. Ehab the Xorcist_数组_02,所有元素之和的结果为 Codeforces 1325 D. Ehab the Xorcist_数组_03
异或可以考虑为不进位的加法。

分类讨论一下:

  1. Codeforces 1325 D. Ehab the Xorcist_数组_06Codeforces 1325 D. Ehab the Xorcist_数组_07 都为 Codeforces 1325 D. Ehab the Xorcist_分类讨论_08 时,答案为 Codeforces 1325 D. Ehab the Xorcist_分类讨论_08
  2. Codeforces 1325 D. Ehab the Xorcist_分类讨论_10时,答案为 Codeforces 1325 D. Ehab the Xorcist_数组_06 或者 Codeforces 1325 D. Ehab the Xorcist_数组_07
  3. Codeforces 1325 D. Ehab the Xorcist_分类讨论_13 时,答案为 Codeforces 1325 D. Ehab the Xorcist_数组_14
  4. 两个相同的数异或值肯定为 Codeforces 1325 D. Ehab the Xorcist_分类讨论_08 , Codeforces 1325 D. Ehab the Xorcist_分类讨论_08 异或任何数又是那个数的本身,所以我们设 Codeforces 1325 D. Ehab the Xorcist_数组_17 然后输出 Codeforces 1325 D. Ehab the Xorcist_分类讨论_18,肯定符合。
  5. 如果 Codeforces 1325 D. Ehab the Xorcist_数组_19 那么肯定是 Codeforces 1325 D. Ehab the Xorcist_数组_14
  6. 还有一种长度为 Codeforces 1325 D. Ehab the Xorcist_分类讨论_21 的情况。Codeforces 1325 D. Ehab the Xorcist_分类讨论_18 合并变成了 Codeforces 1325 D. Ehab the Xorcist_数组_23,这种情况特判即可。

AC代码:

const int N = 2e5 + 10;
ll u, v, x, y, z;

int main()
{
sldd(u, v);
if (u == v && v == 0)
{
puts("0");
return 0;
}
if (u == v)
{
puts("1");
pld(u);
return 0;
}
if (u > v || (v - u) % 2)
{
puts("-1");
return 0;
}
x = (v - u) / 2;
y = (v + u) / 2;
if (x + y == v && (x ^ y) == u)
{
puts("2");
pldd(x, y);
return 0;
}
z = (v - u) / 2;
puts("3");
plddd(z, z, u);
return 0;
}