1 题目及要求
1.1 题目描述
给出n个数字a_1, …., a_n,求最多有多少个不重叠的非空区间,使得每个区间内数字的异或(xor)都为0。
即找出最大的k,使得存在k个区间(l(i),r(i)),满足
1<=l(i)<=r(i)<=n (1<=i<=k), r(i)<l(i+1) (1<=i<k),且
a[l(i)] xor a[l(i)+1] xor …. xor a[r(i)] ==0 (1<=i<=k)
例如:
当输入为[3, 0, 2, 2]时,答案为2,存在2个区间[1] 和 [2, 2]满足;
当输入为[2, 2, 0, 2, 2]时,答案为3,[2, 2],[0] 和[2, 2]满足。
2 解答
2.1 题目分析
动态规划。
2.2 代码
#include <iostream>
#include <vector>
using namespace std;
int numberOfXor0(vector<int> &nums) {
int n = nums.size();
if (n < 1) return 0;
vector<int> dt(n+1);
dt[0] = 0;
for (int k1(0),tmp;k1 < n;++k1) {
dt[k1+1] = dt[k1];
tmp = 0;
for (int k2(k1);-1 < k2;--k2) {
tmp ^= nums[k2];
if (!tmp && dt[k1+1]<1+dt[k2]) dt[k1+1]=1+dt[k2];
}
}
return dt[n];
}
int main(){
vector<int> nums{ 3,0,2,2 };
cout << numberOfXor0(nums);
return 0;
}