#J1006C. 最大子段和
最大子段和
白浅妹妹学习了位运算中的异或,如果你没学过,可以试着使用 C++ 中的 ^ 运算符来输出两个数字的异或,例如
cout << (2 ^ -5) 你将得到 2 和 -5 的异或值。
现在给定一个长度为 的数组一个数字 ,白浅妹妹可以选择数组中的某一段区间(也可以不选),并对这一段里面的所有数字分别对 进行异或。异或操作后,白浅妹妹又从数组中随机选择了一段连续的区间(也可以不选),对里面的数字全部求和,请问她求和的获得的值最大是几?
请注意:白浅妹妹两次选择的区间不必相同。
输入格式
第一行包含两个整数 ,意义如题面所示。
接下来一行包含 个正整数 表示数组中的每一个数字。
输出格式
输出一行一个正整数表示答案。
样例输入
4 3
4 4 4 -10
样例输出
21
说明
选前三个位置对 3 进行异或,异或之后数组变为 [7,7,7,-10],此时最大子段和为 21,即选择前三个数字。注意:选择整个数组进行异或也可以得到 21 的最大子段和。
样例输入2
4 3
7 7 -1 7
样例输出2
20
说明
不选择任何地方进行异或,最大子段和为 20
样例输入3
5 16
15 7 -2 7 7
样例输出3
82
说明
整个数组全部异或 16,得到 [31,23,-18,23,23],全部求和得到 82。
测试点说明
| 测试点编号 | 特殊性质 | ||
|---|---|---|---|
| 1 | =0 | ||
| 2-3 | |||
| 4-5 | |||
| 6 | =1 | ||
| 7-10 |
对于所有的测试点,满足 $-10^5 \leq a_i \leq 10^5, 1 \leq n \leq 10^5, 0 \leq k \leq 10^5$。
相关
在下列比赛中: