275. To xor or not to xor
time limit per test: 0.25 sec.
memory limit per test: 65536 KB
memory limit per test: 65536 KB
input: standard
output: standard
output: standard
The sequence of non-negative integers A1, A2, ..., AN is given. You are to find some subsequence Ai1, Ai2, ..., Aik (1 <= i1 < i2 < ... < ik <= N) such, that Ai1 XOR Ai2 XOR ... XOR Aik has a maximum value.
Input
The first line of the input file contains the integer number N (1 <= N <= 100). The second line contains the sequence A1, A2, ..., AN (0 <= Ai <= 10^18).
Output
Write to the output file a single integer number -- the maximum possible value of Ai1 XOR Ai2 XOR ... XOR Aik.
Sample test(s)
Input
3 11 9 5
Output
14
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll b[105];
const int M=(int)(log(1e18)/log(2))+1;
void solve(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
ll a;
scanf("%lld",&a);
for(int j=M;j>=0;j--){
if((a>>j)&1){
if(b[j]){
a^=b[j];
}
else{
b[j]=a;
for(int k=j-1;k>=0;k--){
if((b[j]>>k&1)&&b[k]){
b[j]^=b[k];
}
}
for(int k=j+1;k<=M;k++){
if(b[k]>>j&1){
b[k]^=b[j];
}
}
break;
}
}
}
}
ll ans=0;
for(int i=0;i<=M;i++){
ans^=b[i];
}
printf("%lld",ans);
}
int main(){
solve();
return 0;
}