Data una sequenza di tre sequenze binarie A B e C di N bit. Contare i bit minimi richiesti per capovolgere A e B in modo tale che XOR di A e B sia uguale a C. For Esempio :
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 Approccio ingenuo consiste nel generare tutte le possibili combinazioni di bit in A e B e quindi eseguirli XOR per verificare se è uguale a C o meno. Complessità temporale di questo approccio cresce esponenzialmente, quindi non sarebbe meglio per un grande valore di N.
Un altro L'approccio consiste nell'utilizzare il concetto di XOR.
XOR Truth Table Input Output X Y Z 0 0 - 0 0 1 - 1 1 0 - 1 1 1 - 0
Se generalizziamo troveremo che in qualsiasi posizione di A e B dobbiamo solo capovolgere ith(da 0 a N-1) posizione di A o B, altrimenti non saremo in grado di raggiungere il numero minimo di bit.
Quindi in qualsiasi posizione di i (da 0 a N-1) incontrerai due tipi di situazione, ovvero A[i] == B[i] o A[i] != B[i]. Discutiamone uno per uno.
-
Se A[i] == B[i] allora lo XOR di questi bit sarà 0 si verificano due casi in C[]: C[i]==0 o C[i]==1.
Se C[i] == 0 allora non è necessario invertire il bit ma se C[i] == 1 allora dobbiamo invertire il bit in A[i] o B[i] in modo che 1^0 == 1 o 0^1 == 1.
-
Se A[i] != B[i] allora XOR di questi bit dà 1. In C si verificano nuovamente due casi, ovvero C[i] == 0 o C[i] == 1.
Pertanto se C[i] == 1 allora non dobbiamo invertire il bit ma se C[i] == 0 allora dobbiamo invertire il bit in A[i] o B[i] in modo che 0^0==0 o 1^1==0
// C++ code to count the Minimum bits in A and B #include 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 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>
Produzione
2
Complessità temporale: SU)
Spazio ausiliario: O(1)
Approccio efficiente:
Questo approccio segue la complessità temporale O(log N).
C++// C++ code to count the Minimum bits in A and B #include 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.
Python3 def totalFlips(A B C N): INTSIZE = 31 ans = 0 i = 0 while N > 0: # Considering only 31 bits a = int(A[i * INTSIZE: min(INTSIZE + i * INTSIZE N)] 2) b = int(B[i * INTSIZE: min(INTSIZE + i * INTSIZE N)] 2) c = int(C[i * INTSIZE: min(INTSIZE + i * INTSIZE N)] 2) Z = a ^ b ^ c # builtin function for counting the number of set bits. ans += bin(Z).count('1') i += 1 N -= 32 return ans # Driver Code if __name__ == '__main__': # N represent total count of Bits N = 5 a = '10100' b = '00010' c = '10011' print(totalFlips(a b c N))
C# using System; class Program { 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 = Convert.ToInt32( A.Substring(i * INTSIZE Math.Min(INTSIZE N)) 2); int b = Convert.ToInt32( B.Substring(i * INTSIZE Math.Min(INTSIZE N)) 2); int c = Convert.ToInt32( C.Substring(i * INTSIZE Math.Min(INTSIZE N)) 2); int Z = a ^ b ^ c; // builtin function for // counting the number of set bits. ans += BitCount(Z); i++; N -= 32; } return ans; } static int BitCount(int i) { i = i - ((i >> 1) & 0x55555555); i = (i & 0x33333333) + ((i >> 2) & 0x33333333); return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; } static void Main(string[] args) { // N represent total count of Bits int N = 5; string a = '10100'; string b = '00010'; string c = '10011'; Console.WriteLine(TotalFlips(a b c N)); } }
JavaScript function TotalFlips(A B C N) { let INTSIZE = 31; let ans = 0; let i = 0; while (N > 0) { // Considering only 31 bits let a = parseInt(A.substring(i * INTSIZE Math.min(INTSIZE + i * INTSIZE N)) 2); let b = parseInt(B.substring(i * INTSIZE Math.min(INTSIZE + i * INTSIZE N)) 2); let c = parseInt(C.substring(i * INTSIZE Math.min(INTSIZE + i * INTSIZE N)) 2); let Z = a ^ b ^ c; // builtin function for // counting the number of set bits. ans += Z.toString(2).split('1').length - 1; i++; N -= 32; } return ans; } // Driver Code let N = 5; let a = '10100'; let b = '00010'; let c = '10011'; console.log(TotalFlips(a b c N));
Produzione
2
Perché questo codice funziona?
Osserviamo che il bit deve essere invertito se A[i]^B[i] !=C[i]. Quindi possiamo ottenere il numero di capovolgimenti calcolando il numero di bit impostati in a^b^c dove abc sono rappresentazioni intere di stringa binaria. Ma la lunghezza della stringa può essere maggiore di 32 dimensioni di un tipico tipo int. Quindi il piano è dividere la stringa in sottostringhe di lunghezza 31 eseguire operazioni e contare i bit impostati come menzionato per ciascuna sottostringa.
Complessità temporale: O(logN) mentre il ciclo while viene eseguito per log31N volte e il conteggio dei bit impostati rappresentano al massimo O(32) per 32 bit e O(64) per 64 bit e per ciascuna operazione di sottostringa O(31).
Complessità spaziale: O(1) da notare che l'operazione di sottostringa richiede spazio O (32).
'