Codeforces Round #705 (Div. 2) E. Enormous XOR

传送门

题目大意

以二进制形式给长度为n的两个数l和r,l可能有前导0,r没有前导0,选两个数x,y满足l<=x&&x<=y&&y<=r,计算x⊕x+1⊕…⊕y-1⊕y按位异或最大值

题解

如果l有前导零,r没有,很明显x选01111… y选10000…这样最大,因为就这两个数参与了异或,并且二进制全部为1,如果l和r第一位都是1,那么我们能增加的最多不过结尾的1,因为相邻的两个数一偶一奇时,异或只会剩下1,比如110和111,110010和110011,如果x到y有偶数个数,显然我们的最高位的1会消失,这样就没法找更大的了,如果x到y有奇数个,我们x如果是奇数,y也是奇数,那么除了x剩下偶数个会两两匹配为1,这样x再异或不会大,只有可能变小,x如果是偶数,那么我们的y也会是偶数(因为x到y有奇数个数,比如2 3 4,显然y是偶数),x和x+1匹配出1,x+2和x+3匹配出1…而我们的y和1异或能变大1,所以让匹配数量为奇数个,那样x⊕x+1⊕…⊕y-1⊕y就能让y+1,所以y直接选择为r大小,y如果是奇数,直接输出,如果是偶数,+1输出,上代码

#include<iostream>
#include<string>
using namespace std;
string a,b;
int n;
string add(string s){
	int i=n-1;
	while(s[i]=='1'){
		s[i]='0';
		i--;
	}
	s[i]='1';
	return s;
}
int main(){
	cin>>n;
	cin>>a;
	cin>>b;
	if(a[0]=='0'&&b[0]=='1'){
		for(int i=0;i<n;i++){
			cout<<1;
		}
		cout<<endl;
	}else if(b[n-1]=='1'||add(a)==b||a==b){
		cout<<b;
	}else{
		cout<<add(b);
	}
	return 0;
}

Q^Q还是感觉解释的不清呀,如果有错,欢迎指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值