Nikitosh y XOR LibreOJ-10051
Nikitosh y XOR LibreOJ-10051 Significado de la
pregunta:
la cantidad dada es NNN secuencia de números A, elvalor máximorequerido:(A [l 1] ⨁ A [l 1 + 1] ⨁… ⨁ A [r 1]) + (A [l 2] ⨁ A [l 2 + 1]… ⨁ A [ r 2]) (A [l1] ⨁A [l1 + 1] ⨁… ⨁A [r1]) + (A [l2] ⨁A [l2 + 1]… ⨁A [r2])( A [ l 1 ]⨁A [ l 1+1 ]⨁...⨁A [ r 1 ] )+( A [ l 2 ]⨁A [ l 2+1 ]...⨁A [ r 2 ] ) , donde1 ≤ l 1 ≤ r 1 <l 2 ≤ r 2 ≤ N 1≤l1≤r1 <l2≤r2≤N1≤l 1≤r 1<l 2≤r 2≤norte
Idea:
XOR tiene dos propiedades: x ⨁ x = 0, x ⨁ 0 = xx⨁x = 0, x⨁0 = xX⨁X=0 ,X⨁0=x , por lo que durante un período de[l, r] [l, r]continuo[ l ,El OR exclusivo de r ] se puede calcular con el prefijo yl [l - 1], l [r] l [l-1], l [r]l [ l-1 ] ,l [ r ] , luegol [l - 1] ⨁ l [r] l [l-1] ⨁l [r]l [ l-1 ]⨁l [ r ] es[l, r] [l, r][ l ,r ] intervalo exclusivo o suma.
Este problema se transforma en[1, i] [1, i][ 1 ,i ] Elija dos números en el intervalo para maximizar el resultado XOR.Apareció el árbol del diccionario
6.187.655 R [i] R [i]R [ i ] toma i como el punto final y el intervalo máximo XOR suma de la mitad derecha;L [i] L [i]L [ i ] es la suma XOR del intervalo máximo de la mitad izquierda con i como punto final. Entonces la respuesta es atravesar:L [i] + R [i + 1] L [i] + R [i + 1]L [ i ]+R [ i+1 ] El valor máximo.
int n;
int trie[maxn*32+5][2],tot=1;
int a[maxn],l[maxn],r[maxn],L[maxn],R[maxn];
void inser(int a){
//trie插入
int p=1;
int ch=1;
for(int i=31;i>=0;i--){
ch=(a>>i)&1;
if(trie[p][ch]==0)trie[p][ch]=++tot;
p=trie[p][ch];
}
}
int sear(int a){
int p=1;
int ch=1,ans=0;
for(int i=31;i>=0;i--){
ch=a>>i&1;
if(trie[p][ch^1]){
p=trie[p][ch^1];
ans|=1<<i;
}else{
p=trie[p][ch];
}
}
return ans;
}
int main(){
int n;
int res=0;
sci(n);
inser(0);
for(int i=1;i<=n;i++){
sci(a[i]);
l[i]=l[i-1]^a[i];
L[i]=max(L[i-1],sear(l[i]));
inser(l[i]);
}
for(int i=n;i>=1;i--){
r[i]=r[i+1]^a[i];
R[i]=max(R[i+1],sear(r[i]));
inser(r[i]);
}
for(int i=1;i<n;i++){
res=max(res,L[i]+R[i+1]);
}
cout<<res<<endl;
return 0;
}