Gravatar
hsl_beat
积分:213
提交:33 / 51

太无聊了 写个水题题解吧(虽然赛时因为读错题被恶心了

题目大意

给你一个数组$A$,你需要选择若干个$A$中的**连续**段,使得每一段元素的异或和都是$K$。求最多选的段数。

$1 \leq n \leq 5 * 10^5$


思路


赛时没看到连续然后被卡半天


首先题目都说连续了,直接使用前缀和维护每一段的异或值,这里需要用到异或的逆运算,这里我手写了,实现很简单。


我们选择段的时候贪心的选,先把数组从前到后遍历一遍,还要维护一个set用来存储所有存在过的前缀异或值和一个总的异或值。


每次我们在set里查找一下有没有值满足对应的后缀能和当前的$a_i$匹配为$K$,我们记$a fxor b$为满足$b xor c = a$的$c$的值,那么我们就需要在set里查找$pre fxor (K fxor a[i])$,其中$pre$表示从最靠左的未匹配的位置到$i-1$之间所有元素的异或值。


如果在set里找到了符合条件的元素,也就是当前的$a_i$能够和一个后缀匹配成为一个异或和为$K$的连续段,那直接清空set,并把$pre$改为$0$,因为你后面考虑的就是下一段了,前面的就都不用管了,这样选的策略会让段的右端点尽量靠前就匹配,是最优的。


注意程序一开始要把set先插入一个$0$否则会WA