Descripción del Problema:
Baby Ehab tiene un array de longitud n y realiza operaciones donde selecciona dos elementos adyacentes, los elimina y reemplaza con su XOR. La longitud del array disminuye en uno cada vez. La pregunta es si es posible hacer que todos los elementos del array sean iguales, dejando al menos dos elementos.
Entrada:
- Primera línea: número de casos de prueba t (1 ≤ t ≤ 15)
- Para cada caso:
- Primera línea: entero n (2 ≤ n ≤ 2000) - longitud del array
- Segunda línea: n enteros a₁, a₂, ..., aₙ (0 ≤ aᵢ < 2³⁰) - elementos del array
Salida:
Para cada caso, imprimir "YES" si es posible hacer todos los elementos iguales con al menos dos elementos restantes, o "NO" si no es posible.
Ejemplo:
Entrada:
2
3
0 2 2
4
2 3 1 10
Salida:
YES
NO
Explicación:
En el primer ejemplo, se pueden eliminar los primeros dos elementos (0 y 2) y reemplazarlos con 0 XOR 2 = 2. El array resultante será [2, 2], donde todos los elementos son iguales.
Enfoque de Solución:
1. Calcular el XOR de todos los elementos del array.
2. Si el resultado del XOR total es 0, siempre es posible lograr la respuesta (imprimir "YES").
3. Si el resultado no es 0, recorrer el array mientras mantenemos un XOR acumulativo.
4. Cada vez que el XOR acumulativo igual al resultado total, incrementamos un contador y reiniciamos el XOR acumulativo.
5. Si el contador es al menos 2, imprimimos "YES"; de lo contrario, "NO".
Código de Solución en C++:
#include <iostream>
#include <vector>
using namespace std;
void resolverCaso() {
int n;
cin >> n;
vector<int> arr(n);
int totalXOR = 0;
// Leer el array y calcular el XOR total
for (int i = 0; i < n; i++) {
cin >> arr[i];
totalXOR ^= arr[i];
}
// Si el XOR total es 0, siempre es posible
if (totalXOR == 0) {
cout << "YES" << endl;
return;
}
// Simular el proceso
int acumulado = 0;
int segmentos = 0;
for (int i = 0; i < n; i++) {
acumulado ^= arr[i];
// Si encontramos un segmento que coincide con el totalXOR
if (acumulado == totalXOR) {
segmentos++;
acumulado = 0; // Reiniciar para el siguiente segmento
}
}
// Verificar si tenemos suficientes segmentos
if (segmentos >= 2) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
int main() {
int t;
cin >> t;
while (t--) {
resolverCaso();
}
return 0;
}
</int></vector></iostream>
Análisis de Complejidad:
- Tiempo: O(n) por caso de prueba, ya que realizamos un recorrido lineal del array.
- Espacio: O(n) para almacenar el array, aunque podríamos optimizar a O(1) si procesamos los elementos sobre la marcha.