题目大意
以二进制形式给长度为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还是感觉解释的不清呀,如果有错,欢迎指正