A由 n 个非负整数组成,同时给你一个整数 maximumBit 。你需要执行以下查询 n 次(n<1e5):
- 找到一个非负整数 k < 2maximumBit ,使得 A[0] XOR A[1] XOR ... XOR A[A.length-1] XOR k 的结果 最大化 。k 是第 i 个查询的答案。
- 从当前数组 A删除 最后 一个元素。
请你返回一个数组 answer,其中 answer[i] 是第 i 个查询的结果。
贪心:算出每个前缀pre的二进制位,然后找到pre的二进制位中0的位置,算出bit 0的贡献到 k 中即可
class Solution {
public:
vector<int> getMaximumXor(vector<int>& A, int maximumBit) {
int n = A.size();
vector<int> ans(n);
vector<int> pre(n+1, 0);
int limit = 1 << maximumBit;
for (int i=1; i<=n; i++)
pre[i] = pre[i-1] ^ A[i-1];
for (int i=n; i>0; i--) {
bitset<32> bit(pre[i]);
int k = 0;
for (int j = 30; j >= 0; j--) {
if (bit[j] == 0 && k + (1 << j) < limit) {
k += 1 << j;
}
}
ans[n-i] = k;
}
return ans;
}
};