专栏文章

题解:SP25844 MAXXOR - Find the max XOR value

SP25844题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio0x3ic
此快照首次捕获于
2025/12/02 11:33
3 个月前
此快照最后确认于
2025/12/02 11:33
3 个月前
查看原文
我们先考虑如果两个数的二进制位数不同的情况,显然这种情况下,我们可以取与 RR 二进制位数相同的最小值 KK 然后取 K(K1)K\oplus(K-1) 即为答案,这个非常容易理解吧。
那么如果位数相同,我们可以不断分别去掉 LLRR 的前导 11(因为这些统一的 11 其实与统一的 00 就没什么区别),直到有一位不同,然后可以参考上面的方法处理。
所以我们发现,实际上只要先取 t=LRt=L\oplus R,然后求 2highbit(t)+112^{\operatorname{highbit}(t)+1}-1 即可。我们注意到 GNU C++ 提供了一个叫做 __builtin_clz 的函数可以计算前导零的数目并且速度非常快(这是对于洛谷评测机来说的,因为可以通过 LZCNT 指令计算,但是部分 OJ 比如 BZOJ 显然不支持,所以只能回退到 BSR 指令实现)。(造了一个 highbit\operatorname{highbit} 这个词语,应该不难理解。)
那么简单了,上代码。
CPP
#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    unsigned long long L, R;
    cin >> L >> R;
    unsigned long long xor_val = L ^ R;
    if (xor_val == 0) {
        cout << "0\n";
        return 0;
    }
    int bit_length = 64 - __builtin_clzll(xor_val);
    unsigned long long result = (1ULL << bit_length) - 1;
    cout << result << '\n';
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...