Máximo par Bitwise OR de un rango

Dado un rango [L, R] , la tarea es encontrar un par (X, Y) tal que L ≤ X, Y ≤ R y (X | Y) sea el máximo entre todos los pares posibles y luego imprimir el OR bit a bit del par encontrado.
Ejemplos: 
 

Entrada: L = 4, R = 5 
Salida:
El único par es (4, 5) y (4 | 5) = 5.
Entrada: L = 14, R = 2500 
Salida: 4095 
 

Enfoque ingenuo: iterar de L a R y verificar el OR bit a bit para cada par posible e imprimir el valor máximo al final.
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ implementation of the approach
#include <climits>
#include <iostream>
using namespace std;
 
// Function to return the maximum bitwise OR
// possible among all the possible pairs
int maxOR(int L, int R)
{
    int maximum = INT_MIN;
 
    // Check for every possible pair
    for (int i = L; i < R; i++)
        for (int j = i + 1; j <= R; j++)
 
            // Maximum among all (i, j) pairs
            maximum = max(maximum, (i | j));
 
    return maximum;
}
 
// Driver code
int main()
{
    int L = 4, R = 5;
 
    cout << maxOR(L, R);
 
    return 0;
}

Java

// Java implementation of the approach
class GFG
{
 
// Function to return the maximum bitwise OR
// possible among all the possible pairs
static int maxOR(int L, int R)
{
    int maximum = Integer.MIN_VALUE;
 
    // Check for every possible pair
    for (int i = L; i < R; i++)
        for (int j = i + 1; j <= R; j++)
 
            // Maximum among all (i, j) pairs
            maximum = Math.max(maximum, (i | j));
 
    return maximum;
}
 
// Driver code
public static void main(String []args)
{
    int L = 4, R = 5;
 
    System.out.println(maxOR(L, R));
}
}
 
// This code is contributed by Rajput-Ji

Python3

# Python3 implementation of the approach
 
# Function to return the maximum bitwise OR
# possible among all the possible pairs
def maxOR(L, R):
    maximum = -10**9
 
    # Check for every possible pair
    for i in range(L, R):
        for j in range(i + 1, R + 1):
 
            # Maximum among all (i, j) pairs
            maximum = max(maximum, (i | j))
 
    return maximum
 
# Driver code
L = 4
R = 5
 
print(maxOR(L, R))
 
# This code is contributed by Mohit Kumar

C#

// C# implementation of the approach
using System;
     
class GFG
{
 
// Function to return the maximum bitwise OR
// possible among all the possible pairs
static int maxOR(int L, int R)
{
    int maximum = int.MinValue;
 
    // Check for every possible pair
    for (int i = L; i < R; i++)
        for (int j = i + 1; j <= R; j++)
 
            // Maximum among all (i, j) pairs
            maximum = Math.Max(maximum, (i | j));
 
    return maximum;
}
 
// Driver code
public static void Main(String []args)
{
    int L = 4, R = 5;
 
    Console.WriteLine(maxOR(L, R));
}
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
// JavaScript implementation of the approach
 
// Function to return the maximum bitwise OR
// possible among all the possible pairs
function maxOR(L, R)
{
    let maximum = Number.MIN_VALUE;
 
    // Check for every possible pair
    for (let i = L; i < R; i++)
        for (let j = i + 1; j <= R; j++)
 
            // Maximum among all (i, j) pairs
            maximum = Math.max(maximum, (i | j));
 
    return maximum;
}
 
// Driver code
    let L = 4, R = 5;
 
    document.write(maxOR(L, R));
 
 
// This code is contributed by shivanisinghss2110
 
</script>
Producción: 

5

 

Complejidad temporal: O(n 2 )

Espacio auxiliar: O(1)
Enfoque eficiente: la operación OR establece el i -ésimo bit si cualquiera de los operandos tiene el i -ésimo bit establecido. Nuestro objetivo es maximizar el número de bits establecidos.
Ahora la tarea es encontrar el bit B más significativo donde L y R difieren. El bit B se establecerá en R y no en L. El OR máximo que se puede generar tendrá todos los bits significativos para el bit B igual que L y R y todos los bits menos significativos que Bse establecerán ya que serán inclusivos en el rango. B th bit será 1 en el OR como 1 | 0 será 1.
Ahora, considere las representaciones binarias de L y R , desde el bit más significativo (MSB) hasta el bit menos significativo (LSB). Suponga que los primeros x bits son los mismos para L y R. Entonces, todos los A y B posibles tienen los primeros x bits iguales a L y R , ya que incluso si cambia un solo bit entre estos x bits, el valor se moverá fuera del rango [L, R], lo cual no está permitido.
A continuación, se establecerán todos los bits menos significativos que el bit de diferencia B , incluido B .
Considere el siguiente ejemplo, 
L = 001100010 
R = 001100110 Los
primeros seis bits son iguales para L y R , por lo que todos los números N, tales que L≤ N < R se mantienen, tendrán sus primeros seis bits iguales a L (o R ) y también O de cualquiera de los dos números en el rango tendrá los mismos primeros seis bits.
Ahora, ignorando la primera xbits, encontramos una discrepancia en el bit. En este punto, A puede construirse de manera que el bit no coincidente no se establezca para A y se establezcan todos los bits menos significativos que el bit actual. De manera similar, B puede construirse de manera que el bit de desajuste se establezca para B y todos los bits subsiguientes no se establezcan en B.
Su OR tendrá todos los bits, incluido el bit de desajuste establecido. 
Aplicando esta lógica a nuestro ejemplo, tenemos A = 001100011 y B = 001100100 y su OR es 001100111, que es el máximo posible.
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ implementation of the approach
#include <iostream>
using namespace std;
 
const int MAX = 64;
 
// Function to return the maximum bitwise OR
// possible among all the possible pairs
int maxOR(int L, int R)
{
 
    // If there is only a single value
    // in the range [L, R]
    if (L == R) {
        return L;
    }
 
    int ans = 0;
 
    // Loop through each bit from MSB to LSB
    for (int i = MAX - 1; i >= 0; i--) {
        int p, lbit, rbit;
        p = 1 << i;
        lbit = (L >> i) & 1; // bit of left limit
        rbit = (R >> i) & 1; // bit of right limit
 
        // MSBs where the bits differ,
        // all bits from that bit are set
        if ((rbit == 1) && (lbit == 0)) {
            ans += (p << 1) - 1;
            break;
        }
 
        // If MSBs are same, then ans
        // bit is same as that of
        // bit of right or left limit
        if (rbit == 1) {
            ans += p;
        }
    }
    return ans;
}
 
// Driver code
int main()
{
    int L = 4, R = 5;
 
    cout << maxOR(L, R);
 
    return 0;
}

Java

// Java implementation of the approach
class GFG
{
static int MAX = 64;
 
// Function to return the maximum bitwise OR
// possible among all the possible pairs
static int maxOR(int L, int R)
{
 
    // If there is only a single value
    // in the range [L, R]
    if (L == R)
    {
        return L;
    }
 
    int ans = 0;
 
    // Loop through each bit from MSB to LSB
    for (int i = MAX - 1; i >= 0; i--)
    {
        int p, lbit, rbit;
        p = 1 << i;
        lbit = (L >> i) & 1; // bit of left limit
        rbit = (R >> i) & 1; // bit of right limit
 
        // MSBs where the bits differ,
        // all bits from that bit are set
        if ((rbit == 1) && (lbit == 0))
        {
            ans += (p << 1) - 1;
            break;
        }
 
        // If MSBs are same, then ans
        // bit is same as that of
        // bit of right or left limit
        if (rbit == 1)
        {
            ans += p;
        }
    }
    return ans;
}
 
// Driver code
public static void main(String[] args)
{
    int L = 4, R = 5;
 
    System.out.println(maxOR(L, R));
}
}
 
// This code is contributed by Rajput-Ji

Python3

# Python3 implementation of the approach
 
MAX = 64;
 
# Function to return the maximum bitwise OR
# possible among all the possible pairs
def maxOR(L, R) :
 
    # If there is only a single value
    # in the range [L, R]
    if (L == R) :
        return L;
 
    ans = 0;
 
    # Loop through each bit from MSB to LSB
    for i in range(MAX - 1, -1, -1) :
        p = 1 << i;
        lbit = (L >> i) & 1; # bit of left limit
        rbit = (R >> i) & 1; # bit of right limit
 
        # MSBs where the bits differ,
        # all bits from that bit are set
        if ((rbit == 1) and (lbit == 0)) :
            ans += (p << 1) - 1;
            break;
 
        # If MSBs are same, then ans
        # bit is same as that of
        # bit of right or left limit
        if (rbit == 1) :
            ans += p;
  
    return ans;
 
# Driver code
if __name__ == "__main__" :
 
    L = 4; R = 5;
 
    print(maxOR(L, R));
 
    # This code is contributed by kanugargng

C#

// C# implementation of the above approach
using System;
     
class GFG
{
static int MAX = 64;
 
// Function to return the maximum bitwise OR
// possible among all the possible pairs
static int maxOR(int L, int R)
{
 
    // If there is only a single value
    // in the range [L, R]
    if (L == R)
    {
        return L;
    }
 
    int ans = 0;
 
    // Loop through each bit from MSB to LSB
    for (int i = MAX - 1; i >= 0; i--)
    {
        int p, lbit, rbit;
        p = 1 << i;
        lbit = (L >> i) & 1; // bit of left limit
        rbit = (R >> i) & 1; // bit of right limit
 
        // MSBs where the bits differ,
        // all bits from that bit are set
        if ((rbit == 1) && (lbit == 0))
        {
            ans += (p << 1) - 1;
            break;
        }
 
        // If MSBs are same, then ans
        // bit is same as that of
        // bit of right or left limit
        if (rbit == 1)
        {
            ans += p;
        }
    }
    return ans;
}
 
// Driver code
public static void Main(String[] args)
{
    int L = 4, R = 5;
 
    Console.WriteLine(maxOR(L, R));
}
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
// Javascript implementation of the approach
 
let MAX = 64;
// Function to return the maximum bitwise OR
// possible among all the possible pairs
function maxOR(L,R)
{
    // If there is only a single value
    // in the range [L, R]
    if (L == R)
    {
        return L;
    }
   
    let ans = 0;
   
    // Loop through each bit from MSB to LSB
    for (let i = MAX - 1; i >= 0; i--)
    {
        let p, lbit, rbit;
        p = 1 << i;
        lbit = (L >> i) & 1; // bit of left limit
        rbit = (R >> i) & 1; // bit of right limit
   
        // MSBs where the bits differ,
        // all bits from that bit are set
        if ((rbit == 1) && (lbit == 0))
        {
            ans += (p << 1) - 1;
            break;
        }
   
        // If MSBs are same, then ans
        // bit is same as that of
        // bit of right or left limit
        if (rbit == 1)
        {
            ans += p;
        }
    }
    return ans;
}
 
// Driver code
let L = 4, R = 5;
   
document.write(maxOR(L, R));
 
// This code is contributed by unknown2108
</script>
Producción: 

5

 

Complejidad temporal: O(log 2 (R)), donde R es el límite superior del rango.

Espacio Auxiliar: O(1)
 

Publicación traducida automáticamente

Artículo escrito por balindam 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 *