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
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.
davy.ai
Solución Propuesta
Enfoque
Podemos observar que la operación XOR satisface las siguientes propiedades:
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
a. Si ((1 << i) & S) != 0 y ((x | (1 << i)) <= k), configurar el bit i-ésimo de x en 1.
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