兔子的区间密码
兔子的区间密码
https://ac.nowcoder.com/acm/problem/20860
题意:
给与一个区间,求在区间选二个数的异或值最大为多少?
思路:
对于区间[L,R]:
①:L的二进制串长度小于R的二进制串长度,例如L=101(5),R=1110(14)。由于3<4,所以111和1000一定在[L,R]区间,因为1000为二进制长度为4的最小值,111为二进制长度为3的最大值。
②:L的二进制串长度等于R的二进制串长度,则在[L,R]区间中的每一个数的最高位都为1,最高位异或后一定为0,所以等价于求区间[L-(1<<(最高位)),R-(1<<(最高位))](去掉最高位)的答案。
特判:如果L=R,则输出0,因为二个相同的数异或为0.
代码:
#include <bits/stdc++.h> typedef long long ll; using namespace std; const ll inf=998244353; inline ll read() { ll x=0, y=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') { y=-y; } c=getchar(); } while(c>='0'&&c<='9') { x=(x<<1)+(x<<3)+(c^48); c=getchar(); } return x*y; } int main() { int t; scanf("%d",&t); while(t--) { ll a=read(), b=read(); if(a==b) { printf("0\n"); } else { ll la=(ll)log2(a), lb=(ll)log2(b); while(la==lb&&a!=0) { a=a^(1LL<<la); b=b^(1LL<<lb); la=(ll)log2(a); lb=(ll)log2(b); } printf("%lld\n",(1LL<<(lb+1))-1); } } return 0; }