兔子的区间密码
兔子的区间密码
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;
}
查看16道真题和解析