143. 最大异或对

摘要
Title: 143. 最大异或对
Tag: Trie
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

143. 最大异或对

  • 题意

    在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?

  • 思路

    01Trie模板
    注意:

    • 先插入再查询
      • 可以防止刚开始树为空的边界情况
      • 省去一半的查询时间
    • 核心思路就是,贪心的从高到低去往和自己不同的结点
    • 清空Trie树
      • 一开始son[0][0] = son[0][1] = 0
      • 每次插入时,最后进行son[p][0] = son[p][1] = 0
  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    '''
    Author: NEFU AB-IN
    Date: 2022-03-01 10:18:29
    FilePath: \ACM\Acwing\143.py
    LastEditTime: 2022-03-01 10:48:29
    '''
    N = int(1e5 + 10)

    son = [[0] * 2 for _ in range(N * 31)]
    val, a, idx = [0] * (N * 31), [0] * N, 0 #val记录以结点p结尾的真实值


    def insert(x):
    global idx
    p = 0
    for i in range(30, -1, -1):
    u = x >> i & 1
    if not son[p][u]:
    idx += 1
    son[p][u] = idx
    p = son[p][u]
    val[p] = x


    def query(x):
    p = 0
    for i in range(30, -1, -1):
    u = x >> i & 1
    if son[p][u ^ 1]:
    p = son[p][u ^ 1]
    else:
    p = son[p][u]
    return x ^ val[p]


    n = int(input())
    a = list(map(int, input().split()))
    res = 0
    for i in range(n):
    insert(a[i])
    res = max(res, query(a[i]))
    print(res)
使用搜索:谷歌必应百度