#P1099. 最大子段和
最大子段和
题目描述
小核桃学习了位运算中的异或,如果你没学过,可以试着使用 C++ 中的 ^
运算符来输出两个数字的异或,例如
cout << (2 ^ -5)
你将得到 2 和 -5 的异或值。
现在给定一个长度为 的数组一个数字 ,小核桃可以选择数组中的某一段区间(也可以不选),并对这一段里面的所有数字分别对 进行异或。异或操作后,小核桃又从数组中随机选择了一段连续的区间(也可以不选),对里面的数字全部求和,请问他求和的获得的值最大是几?
请注意:小核桃两次选择的区间不必相同。
输入格式
第一行包含两个整数 ,意义如题面所示。
接下来一行包含 个正整数 表示数组中的每一个数字。
输出格式
输出一行一个正整数表示答案。
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。
数据规模与约定
测试点编号 | 特殊性质 | ||
---|---|---|---|
1 | =0 | ||
2-3 | |||
4-5 | |||
6 | =1 | ||
7-10 |
对于所有的测试点,满足 。