1 条题解

  • 0
    @ 2026-8-28 1:21:53

    题解

    思路推导

    可以证明,通过任意次追加后能够出现的最大值,等于原数组某个连续子数组的异或和最大值。令前缀异或为 p0=0p_0=0、pi=a1⊕⋯⊕aip_i=a_1\oplus\cdots\oplus a_i,则子数组 [l,r][l,r] 的异或和为 pr⊕pl−1p_r\oplus p_{l-1}。

    问题因此转化为:依次加入前缀异或值,求当前值与此前某个值异或后的最大值。

    做法

    维护一棵只包含 8 个二进制层级的 Trie,先插入 p0=0p_0=0。扫描数组并更新当前前缀异或 pip_i。查询时从最高位到最低位,优先走与当前位相反的分支,从而使结果的当前位为 11;若该分支不存在再走相同位。用查询结果更新答案后,将 pip_i 插入 Trie。

    正确性证明

    任意子数组异或都可写成两个前缀异或之异或,反之任意两个前缀异或也唯一对应一个连续子数组。因此,只需在全部前缀异或值对中最大化异或结果。

    处理 pip_i 时,Trie 恰包含 p0,…,pi−1p_0,\ldots,p_{i-1}。二进制数大小由最高个不同位决定,所以查询在每一位优先选择相反分支,会在不影响更高位最优性的前提下最大化当前位;逐位贪心得到与 pip_i 异或最大的旧前缀。所有前缀依次查询后,全部值对都被考虑,最大值即为答案。

    复杂度分析

    每个前缀执行 8 层插入和查询,时间复杂度为 O(8n)=O(n)O(8n)=O(n),空间复杂度为 O(8n)O(8n)。

    • 1

    信息

    ID
    1065
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者