链接: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; }