JavaScript 实现

```javascript
var maximumSubarrayXor = function(nums, queries) {
    const n = nums.length;
    
    // xorScore[i][j]:子数组 nums[i..j] 的异或分数
    const xorScore = Array.from({ length: n }, () => new Array(n).fill(0));
    // maxScore[i][j]:nums[i..j] 范围内所有子数组的最大异或分数
    const maxScore = Array.from({ length: n }, () => new Array(n).fill(0));
    
    // 长度为1的区间
    for (let i = 0; i < n; i++) {
        xorScore[i][i] = nums[i];
        maxScore[i][i] = nums[i];
    }
    
    // 按区间长度递增递推
    for (let len = 2; len <= n; len++) {
        for (let i = 0; i + len - 1 < n; i++) {
            const j = i + len - 1;
            // 异或分数 = 左区间分数 XOR 右区间分数
            xorScore[i][j] = xorScore[i][j - 1] ^ xorScore[i + 1][j];
            // 最大值 = max(当前区间分数, 左区间最大值, 右区间最大值)
            maxScore[i][j] = Math.max(
                xorScore[i][j],
                maxScore[i][j - 1],
                maxScore[i + 1][j]
            );
        }
    }
    
    // 回答所有查询
    return queries.map(([l, r]) => maxScore[l][r]);
};
```

---

思路说明

· 递推公式:
    f(i, j) = f(i, j-1) XOR f(i+1, j),其中 f(i,i) = nums[i]。
    这来源于每次操作将相邻元素异或并收缩数组,最终结果等价于这个递推。
· 区间最大值:
    在 [i, j] 内任意子数组的最大异或分数 =
    max( f(i, j), maxScore[i][j-1], maxScore[i+1][j] )。
· 遍历顺序:按区间长度从小到大,确保依赖的子区间已计算。

---

复杂度

指标 复杂度
时间复杂度 O(n² + q)
空间复杂度 O(n²)

其中 n ≤ 2000,q ≤ 10⁵,每个查询 O(1) 回答。

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐