题解 | #最长异或公共子段#

最长异或公共子段

https://www.nowcoder.com/practice/2b25c51da0c547cf80a29a3f11c7dd84

最长异或公共子段

思路

题目给了两个不同的非负整数 ,分别生成两个无限序列 )。要求找到最长的公共连续子段长度

"公共连续子段"意味着存在 使得对所有 ,有 ,即:

$$

两边同时异或,等价于:

$$

其中 是个固定值。

关键转化

问题变成:找最大的 ,使得存在 ,对连续 值都有

,设 ,则条件变为 对连续 成立。

当我们选 时,条件变成 。什么时候 呢?恰好是 没有公共的 1-bit,即 的时候。

所以问题进一步简化为:最长的连续整数段 ,满足每个数与 按位与为 0。

lowbit 就是答案

的最低位的 1 在第 位(即 的末尾零的个数)。那么 要求 的第 位为 0。但连续的整数中,第 位每隔 个数就会翻转一次。所以最多有 个连续整数使得第 位为 0,同时更高位的约束也可以通过合理选择 的起始位置来满足。

因此答案就是 lowbit,即

可以验证所有样例:

  • ,lowbit = 1
  • ,lowbit = 8
  • ,lowbit = 4
  • ,lowbit =

复杂度

  • 时间:,每组测试
  • 空间:

代码

#include <bits/stdc++.h>
using namespace std;

int main(){
    int T;
    scanf("%d", &T);
    while(T--){
        long long x, y;
        scanf("%lld%lld", &x, &y);
        long long d = x ^ y;
        printf("%lld\n", d & (-d));
    }
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while (T-- > 0) {
            long x = sc.nextLong();
            long y = sc.nextLong();
            long d = x ^ y;
            System.out.println(d & (-d));
        }
    }
}
import sys
input = sys.stdin.readline

T = int(input())
out = []
for _ in range(T):
    x, y = map(int, input().split())
    d = x ^ y
    out.append(str(d & (-d)))
print('\n'.join(out))
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
const lines = [];
rl.on('line', (line) => lines.push(line.trim()));
rl.on('close', () => {
    let idx = 0;
    const T = parseInt(lines[idx++]);
    const res = [];
    for (let i = 0; i < T; i++) {
        const parts = lines[idx++].split(' ').map(BigInt);
        const d = parts[0] ^ parts[1];
        res.push((d & (-d)).toString());
    }
    console.log(res.join('\n'));
});
全部评论

相关推荐

今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,也有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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