Saltar al contenido

Maximice Bitwise XOR de K con dos números de Array C++

    cedido un inconmovible k y una matriz Arr[] de tamaño finalidadla tarea es designar dos instrumentos de la matriz de tal forma que el XOR bit a bit de esos dos con K (es afirmar K Primer medio ambiente seleccionado ⊕ Segundo medio ambiente seleccionado) es el mayor.

    Observación: Cada medio ambiente de la matriz se puede designar tantas veces como sea posible

    Ejemplos:

    Aporte: N = 3, K = 2, luego[]† [1, 2, 3]
    Salida: 3
    Explicación: Si elegimos un medio ambiente del segundo índice
    y uno más del tercer índice, luego el XOR de triplete
    será 2^2^3 = 3, que es el mayor posible.

    Aporte: N = 3, K = 7, luego[] † [4, 2, 3]
    Salida: 7
    Explicación: Si elegimos tanto el medio ambiente del tercer índice,
    entonces el XOR de triplete 7^3^3 = 7, que es el mayor posible.

    Aporte: N = 3, K = 3, luego[] † [1, 2, 3]
    Salida: 3
    Explicación: Si elegimos tanto el medio ambiente del tercer índice,
    entonces el XOR del triplete es 3^3^3 = 3, que es el mayor posible.

    Enfoque ingenuo: El enfoque del problema es:

    Repite todo pares únicos en la matriz y encuentre el valencia xor del triplete y realice un seguimiento del mayor.

    Siga los pasos a continuación para implementar la idea preliminar:

    • Use dos bucles anidados para suscitar todos los pares únicos.
    • Encuentre el xor de cada triplete Arr[i] Arr[j] k
    • Encuentre el mayor de xor para cada par.
    • Al final, devuelve el valencia xor mayor obtenido.

    A continuación se muestra la implementación del enfoque preliminar:

    C++

     

    #include <bits/stdc++.h>

    using namespace std;

     

    int maxXor(vector<int>& v, int k)

    {

        

        

        int n = v.size(), ans = 0;

     

        

        

        for (int i = 0; i < n; i++) {

            for (int j = i; j < n; j++) {

                ans = max(ans, v[i] ^ v[j] ^ k);

            }

        }

        return ans;

    }

     

    int main()

    {

        int N = 3, K = 2;

        vector<int> arr = { 1, 2, 3 };

     

        

        cout << maxXor(arr, K);

        return 0;

    }

    Complejidad del tiempo: O(N * N)
    cuarto auxiliar: O(1)

    Enfoque válido: El problema se puede resolver de forma válido utilizando la estructura de datos Trie basada en la ulterior idea:

    • Para maximizar el xor del triplete, repita todos los instrumentos y considérelos el segundo medio ambiente† y elige el tercer medio ambiente válido de tal forma que el xor del triplete es lo mayor posible.
    • Maximice el XOR eligiendo los otros instrumentos para que el bit resultante es 1 por lo universal, y dar prioridad al MSB primero y luego al LSB porque la contribución de MSB es siempre anciano que el LSB en valencia fracción final.
    • Para hacer esto, comience desde el MSB a LSB y si el bit está establecido entonces buscaremos 0 de forma que la el bit resultante es 1 y al revés
    • Uso Pruebe la estructura de datos† Porque para maximizar el valencia de xor, necesitamos el búsqueda de prefijos para el complemento de ese númeroque se puede hacer eficientemente usando intentar

    Siga los pasos a continuación para resolver este problema:

    • Primero agregue todos los instrumentos al intentar
    • Cada bit en un número tiene 2 posibilidades: 0 1Entonces tenemos 2 punteros en cada Trie Node:
      • chiquillo[0] -> apuntando a 0 pequeño &
      • chiquillo[1] -> apuntando a 1 poco.
    • Ahora coloque todos los instrumentos en el triángulo.
      • Use un conjunto de tamaño de 32 bits (deporte de bits<32> B) y suceder del bit más significativo (MSB) al bit menos significativo (LSB).
      • Ahora comience en la raíz del Trie y verifique si chiquillo[0] o chiquillo[1] está presente (no NULL), dependiendo del bit presente B[j]j va desde 0 hasta el número total de bits) del número.
      • Si está presente, vaya a su hijo, si no, cree un nuevo nodo en ese hijo (0 un poco de 1 poco) e ir a su hijo.
    • Ahora recorra la matriz y considere cada medio ambiente como el segundo medio ambiente electo
    • Hasta ahora, el valencia XOR presente del triplete K ^ arr[i]
    • Encuentra el .ahora tercer medio ambiente use try tal que el xor con el xor presente sea mayor.
      • Comience en la raíz del Trie y en el MSB del número (inicialice respuesta = 0 para obedecer la respuesta).
      • Si el bit presente es colocar en el xor presente, ir a chiquillo[0] para cerciorarse de que no sea NULL.
        • Si no es NULL entonces agregue 2I-1 hasta respuesta (porque este bit se pone en la respuesta), de lo contrario, vaya a chiquillo[1]
      • Si no está configurado, vaya a chiquillo[1] para ver que no es NULL.
        • Si no es NULL, añadimos 2I-1a ans, de lo contrario vamos a chiquillo[0]
    • Encuentre el mayor (digamos maxi) entre el xor mayor posible en cada índice.
    • Devuelve maxi como respuesta.

    A continuación se muestra la implementación del enfoque preliminar:

    C++

     

    #include <bits/stdc++.h>

    using namespace std;

     

    class TrieNode {

    public:

        TrieNode* child[2];

     

        TrieNode()

        {

            

            this->child[0] = NULL;

            

            this->child[1] = NULL;

        }

    };

     

    TrieNode* newNode;

     

    void insert(int x)

    {

        TrieNode* t = newNode;

     

        

        bitset<32> bs(x);

     

        

        

        for (int j = 30; j >= 0; j--) {

            if (!t->child[bs[j]]) {

                t->child[bs[j]]

                    = new TrieNode();

            }

            t = t->child[bs[j]];

        }

    }

     

    int findMaxXor(int k)

    {

        TrieNode* t = newNode;

        bitset<32> bs(k);

     

        

        

        int ans = 0;

        for (int j = 30; j >= 0; j--) {

     

            

            

            

            if (t->child[!bs[j]]) {

                ans += (1 << j), t = t->child[!bs[j]];

            }

            else {

                t = t->child[bs[j]];

            }

        }

        return ans;

    }

     

    int maxXor(vector<int>& v, int K)

    {

        int n = v.size();

     

        newNode = new TrieNode();

     

        

        for (int i = 0; i < n; i++) {

            insert(v[i]);

        }

     

        

        

        int ans = 0;

     

        

        

        for (int i = 0; i < n; i++) {

            ans = max(ans, findMaxXor(v[i] ^ K));

        }

     

        return ans;

    }

     

    int main()

    {

        int N = 3, K = 2;

        vector<int> arr = { 1, 2, 3 };

     

        

        cout << maxXor(arr, K);

        return 0;

    }

    Complejidad del tiempo: O(N * logM) donde patrón es el medio ambiente mayor de la matriz.
    cuarto auxiliar: O(logM)

    Su Calificación Nos Ayuda a Mejorar
    Etiquetas: