兔子的区间密码

兔子的区间密码

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

相关推荐

小火柴燃烧吧:接啊,接了之后反手在咸鱼找个大学生搞一下,量大从优
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
8 收藏 评论
分享
牛客网
牛客企业服务