AtCoder Regular Contest 135
C - XOR to All:
假设进行的操作是x,y。经过第一次操作y = y ^ x。
然后到了第二次操作就变成了(y ^ x),因为所有的数都已经^ x。那么就变成了^y。
所有这两次操作就相当于在原来的序列上^y。
所以可以发现对于多次操作之后,异或上的数永远都是最后一个,那么显然只要异或一个数求最大值即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> pii; const int N = 1e6 + 5; const int M = 1e7 + 5; const LL Mod = 998244353; #define rep(at,am,as) for(int at = am;at <= as;++at) #define INF 1e10 #define dbg(ax) cout << "now this num is " << ax << endl; inline long long ADD(long long x,long long y) { if(x + y < 0) return ((x + y) % Mod + Mod) % Mod; return (x + y) % Mod; } inline long long MUL(long long x,long long y) { if(x * y < 0) return ((x * y) % Mod + Mod) % Mod; return x * y % Mod; } inline long long DEC(long long x,long long y) { if(x - y < 0) return (x - y + Mod) % Mod; return (x - y) % Mod; } int n,a[N],bit[30]; void solve() { cin >> n; LL ans = 0; rep(i,1,n) { cin >> a[i],ans += a[i]; rep(j,0,29) { if((a[i] >> j) & 1) bit[j]++; } } rep(i,1,n) { LL sum = 0; rep(j,0,29) { int g = (a[i] >> j) & 1; if(g == 1) { sum += 1LL * (n - bit[j]) * (1 << j); } else { sum += 1LL * bit[j] * (1 << j); } } ans = max(ans,sum); } printf("%lld\n",ans); } int main() { // int _; // for(scanf("%d",&_);_;_--) { solve(); //} // system("pause"); return 0; }