問題の説明
問題の解決策
リニアはXOR問題のデータ構造を解くことで、基底クラスである(データ構造は、それが形而上学的なものの一種である...すぎではありません)
列の数については\(\) 、その線形グループ\(D \)する表示されます\(1 \)の最上位ビット\(私は\)の数字を(ここで借りた問題解決「のアラームにハンサム」)。
コンストラクタ
各試行のための番号を挿入します\(X- \)それは現在されている場所を見つけ、(1 \)を\最高レベルです\(POS \) 。
この時間の場合は\(d_posは\) 、既に番号を持って、その後に置く\(X \)排他的または\(d_pos \)努力を続けます。
それ以外の場合は、挿入すぐに正常に挿入break
答えを探して
限り、排他的論理和など、貪欲なアイデアを取る(D_I \)\答え少ない、または単に異なることはありません。
\(\ mathrm {コード} \)
#include<bits/stdc++.h>
using namespace std;
template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-'){
fh=-1;ch=getchar();
}
else fh=1;
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
x*=fh;
}
#define int long long
int d[63],n;
int a[53],ans;
void add(int x){
for(int i=51;i>=0;i--){
if(x&(1ll<<i)){
if(!d[i]){
d[i]=x;break;
}
x=x xor d[i];
}
}
}
void solve(){
for(int i=50;i>=0;i--){
if((ans xor d[i])>ans) ans=ans xor d[i];
}
}
signed main(){
read(n);
for(int i=1;i<=n;i++){
read(a[i]);add(a[i]);
}
solve();
printf("%lld\n",ans);
return 0;
}