链接:https://ac.nowcoder.com/acm/contest/549/D
来源:牛客网

位运算是一个非常重要的东西。
而小A最近在学习位运算,小A看到了一道很简单的例题,
是说从N个数里面选出N-1个数要让它们或起来的值最大,小A想知道这个答案是多少。你可以帮帮他吗?

思路:预处理了一下前缀L数组和后缀R数组,然后枚举那个不选的数就可以了,每次更新ans = max(ans, L[i - 1] | R[i + 1])#include <bits/stdc++.h>
using namespace std;
const int maxn = 6e6 + 5;
int a[maxn];
int L[maxn], R[maxn];
int main() {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        L[i] = L[i - 1] | a[i];
    }
    for (int i = n; i >= 1; i--) {
        R[i] = R[i + 1] | a[i];
    }
    long long ans = 0;
    for (int i = 1; i <= n; i++) {
        ans = max(ans, (L[i - 1] | R[i + 1]) * 1LL);
    }
    cout << ans << endl;
    return 0;
}