"范围与”最接近k的差值

int closestToTarget(vector<int>& arr, int target) {
    // func(arr,l,r)做范围与操作
    // 用set[r]记录所有arr[..r]的“范围与”结果,
    // set[r+1] = { set[r]中各数 & arr[r+1], arr[r+1] }
    unordered_set<int> set1;
    int ans = INT_MAX;
    for (int a : arr) {
        unordered_set<int> set2;
        set2.insert(a);
        for (auto x : set1) {
            set2.insert(x & a);
        }
        for (auto x : set2) {
            ans = min(ans, abs(x - target));
        }
        swap(set1, set2);
    }
    return ans;
}

也可用数组保存中间结果,像下面

子段的范围或

超时

int subarrayBitwiseORs(vector<int>& A) {
    // 用set[r]记录A[..r]子段的ORs结果
    // set[r+1]为 {set[r]中各数 | A[r+1], A[r+1]}
    unordered_set<int> set1, set2, ans;
    for (int a : A) {
        set2 = {a};
        for (int x : set1) {
            set2.insert(x | a);
        }
        ans.insert(set2.begin(), set2.end());
        swap(set1, set2);
    }
    return ans.size();
}

用数组保存中间结果

int subarrayBitwiseORs(vector<int>& A) {
    // 在数组子段B[lo..hi)记录以A[idx]结尾的、A[..idx]所有子段的OR结果
    // A[..idx+1]所有子段的OR结果为 {B[lo..hi)中各数 | A[idx+1], A[idx+1]}
    // OR值放入B中的顺序是 A[idx]、A[idx-1..idx]、A[idx-2..idx]...,一定单调递增,
    // 只需防止到达OR值极限后继续往里塞
    vector<int> B;
    int lo = 0, hi = 0;
    for (int a : A) {
        B.push_back(a);
        for (int i = lo; i < hi; i++) {
            int a2 = B[i] | a;
            // 防止到达OR值极限后继续往里塞
            if (a2 != B.back()) B.push_back(a2); 
        }
        lo = hi;
        hi = B.size();
    }
    return unordered_set<int>(begin(B), end(B)).size();
}