Cuente los bits mínimos para voltear de tal manera que XOR de A y B sea igual a C

Dada una secuencia de tres secuencias binarias A, B y C de N bits. Cuente los bits mínimos necesarios para voltear A y B de modo que XOR de A y B sea igual a C. Por ejemplo: 
 

Input: N = 3
       A = 110
       B = 101
       C = 001
Output: 1
We only need to flip the bit of 2nd position
of either A or B, such that A ^ B = C i.e., 
100 ^ 101 = 001

Un enfoque ingenuo es generar todas las combinaciones posibles de bits en A y B y luego XOR para verificar si es igual a C o no. La complejidad temporal de este enfoque crece exponencialmente, por lo que no sería mejor para un gran valor de N.
Otro enfoque es usar el concepto de XOR. 
 

XOR Truth Table
  Input    Output
 X     Y     Z
 0     0  -  0
 0     1  -  1
 1     0  -  1
 1     1  -  0

Si generalizamos, encontraremos que en cualquier posición de A y B, solo necesitamos cambiar la i -ésima posición (0 a N-1) de A o B; de lo contrario, no podremos alcanzar el número mínimo de Bits. 
Entonces, en cualquier posición de i (0 a N-1) encontrará dos tipos de situaciones, es decir, A[i] == B[i] o A[i] != B[i]. Discutámoslo uno por uno. 
 

  • Si A[i] == B[i] entonces el XOR de estos bits será 0, se dan dos casos en C[]: C[i]==0 o C[i]==1. 
    Si C[i] == 0, entonces no es necesario voltear el bit, pero si C[i] == 1, entonces tenemos que voltear el bit en A[i] o B[i] para que 1^0 == 1 o 0^1 == 1. 
     
  • Si A[i] != B[i] entonces XOR de estos bits da un 1, en C surgen de nuevo dos casos, es decir, C[i] == 0 o C[i] == 1. 
    Por lo tanto, si C[i ] == 1, entonces no necesitamos voltear el bit pero si C[i] == 0, entonces necesitamos voltear el bit en A[i] o B[i] para que 0^0==0 o 1^1==0 
     

C++

// C++ code to count the Minimum bits in A and B
#include<bits/stdc++.h>
using namespace std;
 
int totalFlips(char *A, char *B, char *C, int N)
{
    int count = 0;
    for (int i=0; i < N; ++i)
    {
        // If both A[i] and B[i] are equal
        if (A[i] == B[i] && C[i] == '1')
            ++count;
 
        // If Both A and B are unequal
        else if (A[i] != B[i] && C[i] == '0')
            ++count;
    }
    return count;
}
 
//Driver Code
int main()
{
    //N represent total count of Bits
    int N = 5;
    char a[] = "10100";
    char b[] = "00010";
    char c[] = "10011";
 
    cout << totalFlips(a, b, c, N);
 
    return 0;
}

Java

// Java code to count the Minimum bits in A and B
class GFG {
     
    static int totalFlips(String A, String B,
                                String C, int N)
    {
        int count = 0;
         
        for (int i = 0; i < N; ++i)
        {
            // If both A[i] and B[i] are equal
            if (A.charAt(i) == B.charAt(i) &&
                            C.charAt(i) == '1')
                ++count;
     
            // If Both A and B are unequal
            else if (A.charAt(i) != B.charAt(i)
                          && C.charAt(i) == '0')
                ++count;
        }
         
        return count;
    }
     
    //driver code
    public static void main (String[] args)
    {
        //N represent total count of Bits
        int N = 5;
        String a = "10100";
        String b = "00010";
        String c = "10011";
     
        System.out.print(totalFlips(a, b, c, N));
    }
}
 
// This code is contributed by Anant Agarwal.

Python3

# Python code to find minimum bits to be flip
def totalFlips(A, B, C, N):
 
    count = 0
    for i in range(N):
         
        # If both A[i] and B[i] are equal
        if A[i] == B[i] and C[i] == '1':
            count=count+1
 
        # if A[i] and B[i] are unequal
        else if A[i] != B[i] and C[i] == '0':
            count=count+1
    return count
 
 
# Driver Code
# N represent total count of Bits
N = 5
a = "10100"
b = "00010"
c = "10011"
print(totalFlips(a, b, c, N))

C#

// C# code to count the Minimum
// bits flip in A and B
using System;
 
class GFG {
 
    static int totalFlips(string A, string B,
                          string C, int N)
    {
        int count = 0;
        for (int i = 0; i < N; ++i) {
 
            // If both A[i] and B[i] are equal
            if (A[i] == B[i] && C[i] == '1')
                ++count;
 
            // If Both A and B are unequal
            else if (A[i] != B[i] && C[i] == '0')
                ++count;
        }
        return count;
    }
 
    // Driver code
    public static void Main()
    {
        // N represent total count of Bits
        int N = 5;
        string a = "10100";
        string b = "00010";
        string c = "10011";
 
        Console.Write(totalFlips(a, b, c, N));
    }
}
 
// This code is contributed by Anant Agarwal.

PHP

<?php
// PHP code to count the
// Minimum bits in A and B
 
function totalFlips($A, $B, $C, $N)
{
    $count = 0;
    for ($i = 0; $i < $N; ++$i)
    {
        // If both A[i] and
        // B[i] are equal
        if ($A[$i] == $B[$i] &&
            $C[$i] == '1')
            ++$count;
 
        // If Both A and
        // B are unequal
        else if ($A[$i] != $B[$i] &&
                 $C[$i] == '0')
            ++$count;
    }
    return $count;
}
 
// Driver Code
 
// N represent total count of Bits
$N = 5;
$a = "10100";
$b = "00010";
$c = "10011";
 
echo totalFlips($a, $b, $c, $N);
 
// This code is contributed by nitin mittal.
?>

Javascript

<script>
 
// Javascript code to count the Minimum bits in A and B
   
function totalFlips(A, B, C, N)
    {
        let count = 0;
        for (let i = 0; i < N; ++i) {
   
            // If both A[i] and B[i] are equal
            if (A[i] == B[i] && C[i] == '1')
                ++count;
   
            // If Both A and B are unequal
            else if (A[i] != B[i] && C[i] == '0')
                ++count;
        }
        return count;
    }
   
 
// Driver Code
     
    // N represent total count of Bits
    let N = 5;
    let a = "10100";
    let b = "00010";
    let c = "10011";
   
    document.write(totalFlips(a, b, c, N)); 
       
</script>
Producción

2

Complejidad temporal: O(N) 
Espacio auxiliar: O(1)

Enfoque eficiente:

Este enfoque sigue la complejidad de tiempo O (log N).

C++

// C++ code to count the Minimum bits in A and B
#include <bits/stdc++.h>
using namespace std;
 
int totalFlips(string A, string B, string C, int N)
{
    int INTSIZE = 31;
    int ans = 0;
    int i = 0;
    while (N > 0) {
        // Considering only 31 bits
        int a = stoi(A.substr(i * INTSIZE, min(INTSIZE, N)),
                     0, 2);
        int b = stoi(B.substr(i * INTSIZE, min(INTSIZE, N)),
                     0, 2);
        int c = stoi(C.substr(i * INTSIZE, min(INTSIZE, N)),
                     0, 2);
        int Z = a ^ b ^ c;
        // builtin function for
        // counting the number of set bits.
        ans += __builtin_popcount(Z);
        i++;
        N -= 32;
    }
 
    return ans;
}
 
// Driver Code
int main()
{
    // N represent total count of Bits
    int N = 5;
    char a[] = "10100";
    char b[] = "00010";
    char c[] = "10011";
 
    cout << totalFlips(a, b, c, N);
 
    return 0;
}
 
// This code is contributed by Kasina Dheeraj.

Java

// Java code to count the Minimum bits in A and B
class GFG {
 
    static int totalFlips(String A, String B, String C,
                          int N)
    {
 
        int INTSIZE = 31;
        int ans = 0;
        int i = 0;
        while (N > 0) {
            // Considering only 31 bits
            int a = Integer.parseInt(
                A.substring(i * INTSIZE,
                            i * INTSIZE
                                + Math.min(INTSIZE, N)),
                2);
            int b = Integer.parseInt(
                B.substring(i * INTSIZE,
                            i * INTSIZE
                                + Math.min(INTSIZE, N)),
                2);
            int c = Integer.parseInt(
                C.substring(i * INTSIZE,
                            i * INTSIZE
                                + Math.min(INTSIZE, N)),
                2);
            int Z = a ^ b ^ c;
            // builtin function for
            // counting the number of set bits.
            ans += Integer.bitCount(Z);
            i++;
            N -= 32;
        }
 
        return ans;
    }
 
    // driver code
    public static void main(String[] args)
    {
        // N represent total count of Bits
        int N = 5;
        String a = "10100";
        String b = "00010";
        String c = "10011";
 
        System.out.print(totalFlips(a, b, c, N));
    }
}
 
// This code is contributed by Kasina Dheeraj.
Producción

2

¿Por qué funciona este código?

Observamos que el bit debe invertirse si A[i]^B[i] !=C[i]. Entonces, podemos obtener el número de vueltas calculando el número de bits establecidos en a^b^c donde a,b,c son representaciones enteras de strings binarias. Pero la longitud de la string puede ser superior a 32, el tamaño de un tipo int típico. Entonces, el plan es dividir la string en substrings de longitud 31, realizar operaciones y contar los bits establecidos como se menciona para cada substring.

Complejidad de tiempo: O(log N) a medida que el ciclo while se ejecuta para log 31 N veces y el conteo de bits establecidos cuenta como máximo O(32) para 32 bits y O(64) para 64 bits y para cada operación de substring O( 31).

Complejidad espacial: O(1), para tener en cuenta que la operación de substring necesita espacio O(32).

 
Este artículo es una contribución de Shubham Bansal y Kasina Dheeraj . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente”.
 

Publicación traducida automáticamente

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