AcWing 1414 bovinos XOR

Descripción del Título:

El granjero John encontró un problema mientras alimentaba a sus vacas.

Tiene N vacas en total, numeradas 1∼N.

Antes de cada alimentación, las N vacas se colocarán en una fila del orden de 1∼N.

Además, a cada vaca se le asigna un número entero que puede no ser único.

Entonces, todos los enteros asignados forman una secuencia de enteros de longitud N.

Busque una subsecuencia continua no vacía en la secuencia de números enteros para que la suma XOR de los elementos de la subsecuencia se pueda maximizar.

Si hay varias secuencias de este tipo, seleccione la secuencia con el número de vaca más bajo correspondiente al número entero al final de la secuencia.

Si todavía hay varias secuencias alternativas, elija la que tenga la longitud más corta.

Formato de entrada

La primera línea contiene el número entero N.

En las filas 2∼N + 1, cada fila contiene un número entero, y el número entero en la fila ii representa el valor entero asignado a la vaca numerada i − 1.

Formato de salida

Genere tres números enteros, que representan respectivamente la mayor suma XOR, el número de vaca correspondiente al número entero al comienzo de la secuencia seleccionada y el número de vaca correspondiente al número entero al final de la secuencia seleccionada.

rango de datos

1≤N≤10 ^ 5,
el rango de números enteros asignados a las vacas es [0,2 ^ 21−1].

Muestra de entrada:

5
1
0
5
4
2

Salida de muestra:

6 4 5
#include <iostream>
#include <cstdio>

using namespace std;
const int MAX = 100009;

int son[MAX * 21][2]; // son[p][u] 表示结点编号为p的u儿子(这个题只有0 1两个儿子)的编号
int n, idx;
int s[MAX], id[MAX * 21];

void insert_trie(int num, int k)
{
    int p = 0;

    for(int i = 20; i >= 0; i--)
    {
        int u = num >> i & 1;
        if(!son[p][u])
            son[p][u] = idx++;
        p = son[p][u];
    }
    id[p] = k;
}

int query(int x)
{
    int p = 0;

    for(int i = 20; i>= 0; i--)
    {
        int u = x >> i & 1;
        if(son[p][!u])
            p = son[p][!u];
        else
            p = son[p][u];
    }
    return id[p];
}

int main()
{
    scanf("%d", &n);

    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &s[i]);
        s[i] = s[i] ^ s[i - 1];
    }

    insert_trie(s[0], 0);

    int maxx = -1, l, r;

    for(int i = 1; i <= n; i++)
    {
        int k = query(s[i]);

        int t = s[i] ^ s[k];
        if(t > maxx)
        {
            maxx = t;
            l = k + 1;
            r = i;
        }
        insert_trie(s[i], i);
    }

    printf("%d %d %d\n", maxx, l, r);

    return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44620183/article/details/114059079
Recomendado
Clasificación