【每日一题】兔子的区间密码
兔子的区间密码
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; }