列表

详情


3277. 查询子数组最大异或值

给你一个由 n 个整数组成的数组 nums,以及一个大小为 q 的二维整数数组 queries,其中 queries[i] = [li, ri]

对于每一个查询,你需要找出 nums[li..ri] 中任意 子数组最大异或值

数组的异或值 需要对数组 a 反复执行以下操作,直到只剩一个元素,剩下的那个元素就是 异或值

返回一个大小为 q 的数组 answer,其中 answer[i] 表示查询 i 的答案。

 

示例 1:

输入: nums = [2,8,4,32,16,1], queries = [[0,2],[1,4],[0,5]]

输出: [12,60,60]

解释:

在第一个查询中,nums[0..2] 的子数组分别是 [2], [8], [4], [2, 8], [8, 4], 和 [2, 8, 4],它们的异或值分别为 2, 8, 4, 10, 12, 和 6。查询的答案是 12,所有异或值中的最大值。

在第二个查询中,nums[1..4] 的子数组中最大的异或值是子数组 nums[1..4] 的异或值,为 60。

在第三个查询中,nums[0..5] 的子数组中最大的异或值是子数组 nums[1..4] 的异或值,为 60。

示例 2:

输入: nums = [0,7,3,2,8,5,1], queries = [[0,3],[1,5],[2,4],[2,6],[5,6]]

输出: [7,14,11,14,5]

解释:

下标 nums[li..ri] 最大异或值子数组 子数组最大异或值
0 [0, 7, 3, 2] [7] 7
1 [7, 3, 2, 8, 5] [7, 3, 2, 8] 14
2 [3, 2, 8] [3, 2, 8] 11
3 [3, 2, 8, 5, 1] [2, 8, 5, 1] 14
4 [5, 1] [5] 5

 

提示:

相似题目

使所有区间的异或结果为零

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> maximumSubarrayXor(vector<int>& nums, vector<vector<int>>& queries) { } };

golang 解法, 执行用时: 451 ms, 内存消耗: 55.4 MB, 提交时间: 2024-09-18 10:10:18

func maximumSubarrayXor1(nums []int, queries [][]int) []int {
	n := len(nums)
	f := make([][]int, n)
	mx := make([][]int, n)
	for i := range f {
		f[i] = make([]int, n)
		mx[i] = make([]int, n)
	}
	for i := n - 1; i >= 0; i-- {
		f[i][i] = nums[i]
		mx[i][i] = nums[i]
		for j := i + 1; j < n; j++ {
			f[i][j] = f[i][j-1] ^ f[i+1][j]
			mx[i][j] = max(f[i][j], mx[i+1][j], mx[i][j-1])
		}
	}

	ans := make([]int, len(queries))
	for i, q := range queries {
		ans[i] = mx[q[0]][q[1]]
	}
	return ans
}

// 优化
func maximumSubarrayXor(f []int, queries [][]int) []int {
	n := len(f)
	mx := make([][]int, n)
	for i := n - 1; i >= 0; i-- {
		mx[i] = make([]int, n)
		mx[i][i] = f[i]
		for j := i + 1; j < n; j++ {
			f[j] ^= f[j-1]
			mx[i][j] = max(f[j], mx[i+1][j], mx[i][j-1])
		}
	}

	ans := make([]int, len(queries))
	for i, q := range queries {
		ans[i] = mx[q[0]][q[1]]
	}
	return ans
}

python3 解法, 执行用时: 2847 ms, 内存消耗: 155.6 MB, 提交时间: 2024-09-18 10:09:40

class Solution:
    # 区间dp套区间dp
    def maximumSubarrayXor(self, nums: List[int], queries: List[List[int]]) -> List[int]:
        n = len(nums)
        f = [[0] * n for _ in range(n)]
        mx = [[0] * n for _ in range(n)]
        for i in range(n - 1, -1, -1):
            mx[i][i] = f[i][i] = nums[i]
            for j in range(i + 1, n):
                f[i][j] = f[i][j - 1] ^ f[i + 1][j]
                mx[i][j] = max(f[i][j], mx[i + 1][j], mx[i][j - 1])
        return [mx[l][r] for l, r in queries]

    # 优化后
    def maximumSubarrayXor2(self, f: List[int], queries: List[List[int]]) -> List[int]:
        n = len(f)
        mx = [[0] * n for _ in range(n)]
        for i in range(n - 1, -1, -1):
            mx[i][i] = f[i]
            for j in range(i + 1, n):
                f[j] ^= f[j - 1]
                mx[i][j] = max(f[j], mx[i + 1][j], mx[i][j - 1])
        return [mx[l][r] for l, r in queries]

上一题