面试OR笔试35——xor

来源:互联网 发布:混合高斯算法 编辑:程序博客网 时间:2024/05/29 19:22

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;}


原创粉丝点击