#P1099. 最大子段和

最大子段和

题目描述

小核桃学习了位运算中的异或,如果你没学过,可以试着使用 C++ 中的 ^ 运算符来输出两个数字的异或,例如

cout << (2 ^ -5) 你将得到 2 和 -5 的异或值。

现在给定一个长度为 nn 的数组一个数字 kk,小核桃可以选择数组中的某一段区间(也可以不选),并对这一段里面的所有数字分别对 kk 进行异或。异或操作后,小核桃又从数组中随机选择了一段连续的区间(也可以不选),对里面的数字全部求和,请问他求和的获得的值最大是几?

请注意:小核桃两次选择的区间不必相同。

输入格式

第一行包含两个整数 n,k(1n105)n,k(1 \leq n \leq 10^5),意义如题面所示。

接下来一行包含 nn 个正整数 aia_i 表示数组中的每一个数字。

输出格式

输出一行一个正整数表示答案。

4 3
4 4 4 -10
21
4 3
7 7 -1 7
20
5 16
15 7 -2 7 7
82

样例解释 1

选前三个位置对 3 进行异或,异或之后数组变为 [7,7,7,-10],此时最大子段和为 21,即选择前三个数字。注意:选择整个数组进行异或也可以得到 21 的最大子段和。

样例解释 2

不选择任何地方进行异或,最大子段和为 20

样例解释 3

整个数组全部异或 16,得到 [31,23,-18,23,23],全部求和得到 82。

数据规模与约定

测试点编号 nn kk 特殊性质
1 105\leq 10^5 =0
2-3 200\leq 200 1k1051\leq k\leq 10^5
4-5 2000\leq 2000 1k1051 \leq k \leq 10^5
6 10510^5 =1 ai<0a_i<0
7-10 105\leq 10^5 1k1051 \leq k \leq 10^5

对于所有的测试点,满足 105ai105,1n105,0k105-10^5 \leq a_i \leq 10^5, 1 \leq n \leq 10^5, 0 \leq k \leq 10^5