Encuentre una array tal que ningún subarreglo tenga xor cero o Y

Dados dos enteros X (1 ≤ X ≤ 15) e Y . La tarea es encontrar una array de la longitud máxima posible N tal que todos los elementos de la array se encuentren entre 1 y 2 X y no exista ningún subarreglo tal que el valor xor del subarreglo sea 0 o Y . Si existen varias respuestas, imprima cualquiera de ellas. Si no existe tal array, imprima -1
Ejemplos: 
 

Entrada: X = 3, Y = 5 
Salida: 1 3 1 
(1 ^ 3) = 2 
(3 ^ 1) = 2 
(1 ^ 3 ^ 1) = 3
Entrada: X = 1, Y = 1 
Salida: -1 
 

Enfoque: la idea principal es construir el prefijo-xor de la array requerida y luego construir la array a partir de él. Deje que la array prefix-xor sea pre[]
Ahora, XOR de cualquiera de los dos pares en la array de prefijos (pre[l] ^ pre[r]) representará el XOR de algún subarreglo de la array original, es decir , arr[l + 1] ^ arr[l + 2] ^ … ^ arr[r]
Por lo tanto, el problema ahora se reduce a construir una array a partir de los elementos de la array pre[] de modo que ningún par de elementos tenga bit a bit-xor igual a 0 o Y y su longitud debe ser máxima. 
Tenga en cuenta que ningún par de números tiene una suma xor bit a bit igual a 0 simplemente significaNo se puede usar el mismo número dos veces
Si Y ≥ 2 X , ningún par de números menores que 2 X tendrá un bit a bit xor igual a Y , por lo que puede usar todos los números del 1 al 2 X – 1 en cualquier orden. De lo contrario, puede pensar en los números que forman pares, donde cada par consta de 2 números con una suma xor bit a bit igual a Y. De cualquier par, si agrega un número a la array, no puede agregar el otro. Sin embargo, los pares son independientes entre sí: su elección en un par no afecta a ningún otro par. Por lo tanto, puede elegir cualquier número en cualquier par y agregarlos en el orden que desee. Después de construir el arreglo pre[] , puede construir el arreglo original usando: arr[i] = pre[i] ^ pre[i – 1].
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to find the maximum length array
void maxLengthArr(int x, int y)
{
    // To store if an element is
    // already taken or not
    bool ex[(1 << x)];
  
    // To store visited numbers
    ex[0] = 1;
    vector<int> pre({ 0 });
  
    // For all possible values of pre[]
    for (int i = 1; i < (1 << x); i++) {
  
        // If it is already taken
        if (ex[i ^ y])
            continue;
  
        pre.push_back(i);
        ex[i] = 1;
    }
  
    // Not possible
    if (pre.size() == 1) {
        cout << "-1";
        return;
    }
  
    // Print the array constructing it
    // from the prefix-xor array
    for (int i = 1; i < pre.size(); i++)
        cout << (pre[i] ^ pre[i - 1]) << " ";
}
  
// Driver code
int main()
{
    int X = 3, Y = 5;
  
    maxLengthArr(X, Y);
  
    return 0;
}

Java

// Java implementation of the approach
import java.util.*;
  
class GFG 
{
  
// Function to find the maximum length array
static void maxLengthArr(int x, int y)
{
    // To store if an element is
    // already taken or not
    boolean[] ex = new boolean[(1 << x)];
  
    // To store visited numbers
    ex[0] = true;
    Vector<Integer> pre = new Vector<Integer>();
    pre.add(0);
      
    // For all possible values of pre[]
    for (int i = 1; i < (1 << x); i++) 
    {
  
        // If it is already taken
        if (ex[i ^ y])
            continue;
  
        pre.add(i);
        ex[i] = true;
    }
  
    // Not possible
    if (pre.size() == 1)
    {
        System.out.print("-1");
        return;
    }
  
    // Print the array constructing it
    // from the prefix-xor array
    for (int i = 1; i < pre.size(); i++)
        System.out.print((pre.get(i) ^
                          pre.get(i - 1)) + " ");
}
  
// Driver code
public static void main(String[] args) 
{
    int X = 3, Y = 5;
  
    maxLengthArr(X, Y);
}
}
  
// This code is contributed by 29AjayKumar

Python3

# Python3 implementation of the approach 
  
# Function to find the maximum length array 
def maxLengthArr(x, y) :
  
    # To store if an element is 
    # already taken or not 
    ex = [0] * (1 << x);
      
    # To store visited numbers
    ex[0] = 1;
    pre = [0];
      
    # For all possible values of pre[]
    for i in range(1, (1 << x)) :
          
        # If it is already taken
        if (ex[i ^ y]) :
            continue;
              
        pre.append(i);
        ex[i] = 1;
          
    # Not possible
    if (len(pre) == 1) :
        print("-1", end = "");
        return;
          
    # Print the array constructing it
    # from the prefix-xor array
    for i in range(1, len(pre)) :
        print(pre[i] ^ pre[i - 1], end = " "); 
  
# Driver code
if __name__ == "__main__" :
      
    X = 3; Y = 5;
    maxLengthArr(X, Y); 
  
# This code is contributed by AnkitRai01

C#

// C# implementation of the approach
using System;
using System.Collections.Generic;
  
class GFG
{
  
    // Function to find the maximum length array
    static void maxLengthArr(int x, int y)
    {
        // To store if an element is
        // already taken or not
        bool[] ex = new bool[(1 << x)];
  
        // To store visited numbers 
        ex[0] = true;
        var pre = new List<int>();
        pre.Add(0);
  
        // For all possible values of pre[]
        for (int i = 1; i < (1 << x); i++)
        {
            // If it is already taken 
            if (ex[i ^ y])
                continue;
  
            pre.Add(i);
            ex[i] = true;
        }
  
        // Not possible 
        if (pre.Count == 1)
        {
            Console.Write("-1");
            return;
        }
  
        // Print the array constructing it 
        // from the prefix-xor array 
        for (int i = 1; i < pre.Count; i++)
            Console.Write((pre[i] ^ pre[i - 1]) + " ");
    }
  
    // Driver code 
    public static void Main(String[] args)
    {
        int X = 3, Y = 5;
        maxLengthArr(X, Y);
    }
}
  
// This code is contributed by
// sanjeev2552

Javascript

<script>
  
// Javascript implementation of the approach
  
// Function to find the maximum length array
function maxLengthArr(x, y)
{
    // To store if an element is
    // already taken or not
    let ex = new Array((1 << x)).fill(0);
  
    // To store visited numbers
    ex[0] = 1;
    let pre = [];
    pre.push(0);
  
    // For all possible values of pre[]
    for (let i = 1; i < (1 << x); i++) {
  
        // If it is already taken
        if (ex[i ^ y])
            continue;
  
        pre.push(i);
        ex[i] = 1;
    }
  
    // Not possible
    if (pre.length == 1) {
        document.write("-1");
        return;
    }
  
    // Print the array constructing it
    // from the prefix-xor array
    for (let i = 1; i < pre.length; i++)
        document.write((pre[i] ^ pre[i - 1]) + " ");
}
  
// Driver code
    let X = 3, Y = 5;
  
    maxLengthArr(X, Y);
      
</script>
Producción: 

1 3 1

 

Tema relacionado: Subarrays, subsecuencias y subconjuntos en array

Publicación traducida automáticamente

Artículo escrito por pawan_asipu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *