面试OR笔试35——xor

61 篇文章 0 订阅
61 篇文章 0 订阅

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值