b_lc_每个查询的最大异或值(贪心+位运算)

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;
    }
};
原文地址:https://www.cnblogs.com/wdt1/p/14672531.html