兔子的区间密码

兔子的区间密码

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;
}
全部评论

相关推荐

06-14 19:09
门头沟学院 Java
darius_:给制造业搞的,什么物料管理生产管理,设备管理点检,最最关键的就是一堆报表看板。个人觉得没啥技术含量都是些基本的crud,但是业务很繁琐那种
点赞 评论 收藏
分享
一表renzha:手写数字识别就是一个作业而已
点赞 评论 收藏
分享
评论
10
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务