es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Maximizar la ecuación XOR

Declaración del problema:

Dado un arreglo de n elementos y un entero k, encuentra un entero x en el rango [0, k] tal que la suma XOR(x) se maximice. Imprime el valor máximo de la ecuación.

XOR-sum(x) = (x XOR A1) + (x XOR A2) + (x XOR A3) + … + (x XOR AN)

Formato de entrada:

La primera línea contiene el entero N que denota el número de elementos en A.
La siguiente línea contiene un entero k que denota el valor máximo de x.
Cada línea i de las siguientes N líneas (donde 0 ≤ i ≤ N) contiene un entero que describe Ai.

Restricciones:
1 ≤ n ≤ 10^5
0 ≤ k ≤ 10^9
0 ≤ A[i] ≤ 10^9

Entrada de ejemplo:

3
7
1
6
3

Salida de ejemplo:

14

Explicación:

Xor_sum(4) = (4^1) + (4^6) + (4^3) = 14.

Este problema fue preguntado en el examen de requisitos de Infosys. Estaba revisando los exámenes anteriores y me encontré con este problema. Solo pude encontrar una solución de fuerza bruta que consiste en calcular la ecuación para cada x en el rango [0, k] e imprimir el máximo. Pero la solución no funcionará para las restricciones dadas.

Mi solución:

#include
using namespace std;
int main()
{
int n, k, ans = 0;
cin >> n >> k;
vector a(n);
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i <= k; i++) {
int temp = 0;
for (int j = 0; j < n; j++) {
temp += (i ^ a[j]);
}
ans = max(temp, ans);
}
cout << ans;
return 0;
}

Encontré la solución en un sitio web. No pude entender lo que hace el código, pero esta solución da respuestas incorrectas para algunos casos de prueba.

Desplázate hacia abajo hasta la pregunta 3.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución Propuesta

    Enfoque

    Podemos observar que la operación XOR satisface las siguientes propiedades:

    • x ^ 0 = x
    • x ^ x = 0

    Basándonos en estas propiedades, podemos simplificar la ecuación de la siguiente manera:

    Xor-sum(x) = (x ^ A[1]) + (x ^ A[2]) + … + (x ^ A[N])
    = N * x ^ (A[1] + A[2] + … + A[N])

    Dado que N y (A[1] + A[2] + … + A[N]) son constantes, solo necesitamos maximizar el valor de x ^ (A[1] + A[2] + … + A[N]) para maximizar Xor-sum(x). Podemos hacer esto iterando desde el bit más significativo hasta el menos significativo de (A[1] + A[2] + … + A[N]) y eligiendo el bit que maximice el valor de x. Podemos actualizar el valor de x en cada iteración configurando el bit elegido en 1.

    Algoritmo

    1. Leer los valores de n, k, y A[1], A[2], …, A[N].
    2. Calcular S = A[1] + A[2] + … + A[N].
    3. Inicializar x = 0.
    4. Para i desde 31 hasta 0:
      a. Si ((1 << i) & S) != 0 y ((x | (1 << i)) <= k), configurar el bit i-ésimo de x en 1.
    5. Calcular Xor-sum(x) como N * x ^ S.
    6. Imprimir Xor-sum(x).

    Complejidad Temporal

    La complejidad temporal del algoritmo es O(32 * n) = O(n) ya que iteramos sobre los 32 bits de S y procesamos cada elemento de A solo una vez.

    Entrada y Salida de Ejemplo

    Entrada de Ejemplo

    5
    15
    5
    2
    7
    8
    3

    Salida de Ejemplo

    32

Comments are closed.