Nikitosh y XOR LibreOJ-10051

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≤N1l 1r 1<l 2r 2norte

Idea:
XOR tiene dos propiedades: x ⨁ x = 0, x ⨁ 0 = xx⨁x = 0, x⨁0 = xXX=0 ,X0=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;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44986601/article/details/107126308
Recomendado
Clasificación