给定一个n位01序列,你可以选择三个相邻数字,把他们都变成这三个数的异或和
要求在n次操作内将序列变全0,有解输出方案,无解输出-1。
n<=2e5
题解
性质1:全体异或和的奇偶性不变,可以以此判断有解
构造策略
1.相邻走一遍:结果就是每个位置变成原来的后三个的异或和,似乎不会简化问题
2.隔一位走:两位两位相同,似乎简化了问题,而且可以发现
如果n是奇数,
a
n
=
a
n
−
1
=
a
n
−
2
=
0
a_n=a_{n-1}=a_{n-2}=0
an=an−1=an−2=0,否则无解
奇数如图
□□ □□ □□ □□□
这时候直接反方向再做一次,直接结束
□□□ □□ □□ □□
如果n是偶数
□□ □□ □□□ □
如果最后两位恰好都是0就结束了。
但如果都是1,奇数的方法就不能套用了
□□ □□ 1111
其他情况就无解了
子问题
一个简单的想法是,我们需要找到一个又一个异或和为0的奇数列。
但是仔细一想,真的是一个又一个吗,如果存在,那么必然有一个最左边的,那么右边剩下的也一定是。(因为当前未解决的情况是:异或和为0,n为偶数,所以一定是被分割成两个奇数的偶数长度数列)
总结
构造数列操作题可以考虑的套路:
1.规律性操作
2.分而治之+问题转化
错因
忽视了偶数被分成 1 + (n-1)的情况,虽然1不用操作,但是对后者是有意义的