Zadan je niz od tri binarna niza A B i C od N bitova. Izbrojite minimalne bitove potrebne za prebacivanje A i B tako da XOR od A i B bude jednak C. Za Primjer:
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
A Naivan pristup je generirati sve moguće kombinacije bitova u A i B i zatim ih izvršiti XOR radi provjere je li jednak C ili ne. Vremenska složenost ovog pristupa raste eksponencijalno pa ne bi bilo bolje za veliku vrijednost N.
Još pristup je korištenje koncepta XOR.
XOR Truth Table Input Output X Y Z 0 0 - 0 0 1 - 1 1 0 - 1 1 1 - 0
Ako generaliziramo, otkrit ćemo da na bilo kojoj poziciji A i B samo trebamo okrenuti ith(0 do N-1) položaj A ili B inače nećemo moći postići minimalni broj bitova.
Dakle, na bilo kojoj poziciji od i (0 do N-1) naići ćete na dvije vrste situacije, tj. ili A[i] == B[i] ili A[i] != B[i]. Raspravljajmo o tome jedan po jedan.
-
Ako je A[i] == B[i] tada će XOR ovih bitova biti 0 dva slučaja pojavljuju se u C[]: C[i]==0 ili C[i]==1.
Ako je C[i] == 0 onda nema potrebe za okretanjem bita, ali ako je C[i] == 1 tada moramo okretati bit ili u A[i] ili B[i] tako da je 1^0 == 1 ili 0^1 == 1.
-
Ako je A[i] != B[i], tada XOR ovih bitova daje 1. U C se ponovno pojavljuju dva slučaja, tj. ili C[i] == 0 ili C[i] == 1.
Prema tome, ako je C[i] == 1 tada ne trebamo okrenuti bit, ali ako je C[i] == 0 tada moramo okrenuti bit ili u A[i] ili B[i] tako da je 0^0==0 ili 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>
Izlaz
2
Vremenska složenost: NA)
Pomoćni prostor: O(1)
Učinkovit pristup:
Ovaj pristup slijedi O(log N) vremensku složenost.
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));
Izlaz
2
Zašto ovaj kod radi?
Primjećujemo da se bit mora okrenuti ako je A[i]^B[i] !=C[i]. Dakle, možemo dobiti broj okretaja izračunavanjem broja postavljenih bitova u a^b^c gdje su abc cjelobrojne reprezentacije binarnog niza. Ali duljina niza može biti veća od veličine 32 tipičnog int tipa. Dakle, plan je podijeliti niz u podnizove duljine 31, izvršiti operacije i prebrojati postavljene bitove kao što je spomenuto za svaki podniz.
Vremenska složenost: O(log N) dok se izvodi petlja za zapisnik31N puta i brojeći skup bitova iznosi najviše O(32) za 32-bit i O(64) za 64-bit i za svaku operaciju podniza O(31).
Složenost prostora: O(1) treba napomenuti da operacija podniza zahtijeva O(32) prostora.
'