【每日一题】兔子的区间密码
兔子的区间密码
https://ac.nowcoder.com/acm/problem/20860
题目
给定区间 ,求这个区间中任意选择两个(可以相同的)整数后异或的最大值。
解题思路
如果 与
相等,直接返回 0。
如果 :
判断 与
的最高位是否相等。
如果相同,则这个二进制位不会影响结果,因为从范围内任意选择两个数它们的高位都是这样,异或后相互抵消。
继续比较下一个高位,直到遇到 和
的高位
不同,此时
的高位是 1,
的高位是 0,答案是
。
因为,去掉相同的高位,那么范围内,肯定包含数 和数
,它们异或后得到
。
例如,,
它们二进制的第4位相同,这表示在它们范围之中的所有数的第4位都相同。
第一个不同的高位是第3位,则结果是 。
原因:去掉相同的高位后, 的有效位组成的数是
,
的有效位组成的数是
,那么数
和数
肯定在范围内,而这两个数异或后的数是
。
C++代码
#include<iostream>
using namespace std;
int main(){
int T;
cin >> T;
long long L, R;
while(T--){
cin >> L >> R;
if(L==R){
cout << 0 << endl;
continue;
}
long long tmp = 1LL<<62;
while((L&tmp) == (R&tmp)){
tmp >>= 1;
}
tmp <<= 1;
cout << tmp-1 << endl;
}
return 0;
} 
查看13道真题和解析