logo

A와 B의 XOR이 C와 같도록 뒤집을 최소 비트 수를 계산합니다.

N 비트로 구성된 3개의 이진 시퀀스 A B 및 C의 시퀀스가 ​​주어집니다. A와 B의 XOR이 C와 같도록 A와 B를 뒤집는 데 필요한 최소 비트를 계산합니다. 예 :  
 

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와 B의 가능한 모든 비트 조합을 생성한 다음 이를 XOR하여 C와 같은지 여부를 확인하는 것입니다. 시간 복잡도 이 접근 방식은 기하급수적으로 증가하므로 N 값이 큰 경우에는 좋지 않습니다.
또 다른 접근 방식은 XOR 개념을 사용하는 것입니다. 
 



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


일반화하면 A와 B의 어느 위치에서나 i만 뒤집으면 된다는 것을 알 수 있습니다.(0 ~ N-1) 위치는 A 또는 B입니다. 그렇지 않으면 최소 비트 수를 달성할 수 없습니다. 
따라서 i(0 ~ N-1)의 모든 위치에서 두 가지 유형의 상황, 즉 A[i] == B[i] 또는 A[i] != B[i]에 직면하게 됩니다. 하나씩 토론해보자. 
 


  • A[i] == B[i]이면 이들 비트의 XOR은 0이 됩니다. C[]에서 두 가지 경우가 발생합니다: C[i]==0 또는 C[i]==1. 
    C[i] == 0이면 비트를 뒤집을 필요가 없지만 C[i] == 1이면 A[i] 또는 B[i]에서 비트를 뒤집어 1^0 == 1 또는 0^1 == 1이 되도록 해야 합니다. 
     

  • A[i] != B[i]이면 이 비트의 XOR은 C에 1을 제공합니다. 즉, C[i] == 0 또는 C[i] == 1 중 하나가 다시 발생합니다. 
    따라서 C[i] == 1이면 비트를 뒤집을 필요가 없지만 C[i] == 0이면 A[i] 또는 B[i]에서 비트를 뒤집어 0^0==0 또는 1^1==0이 되도록 해야 합니다. 
     


 

C++
// 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> 

산출
2


시간 복잡도: 에) 
보조 공간: 오(1)

효율적인 접근 방식:

이 접근 방식은 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)); 

산출
2

이 코드가 작동하는 이유는 무엇입니까?

A[i]^B[i] !=C[i]인 경우 비트를 뒤집어야 한다는 것을 알 수 있습니다. 따라서 a^b^c에서 설정된 비트 수를 계산하여 뒤집기 횟수를 얻을 수 있습니다. 여기서 abc는 이진 문자열의 정수 표현입니다. 그러나 문자열 길이는 일반적인 int 유형의 32 크기보다 클 수 있습니다. 따라서 계획은 문자열을 길이 31의 하위 문자열로 나누고 작업을 수행하고 각 하위 문자열에 대해 언급된 대로 세트 비트를 계산하는 것입니다.

시간 복잡도: 오(로그N) while 루프가 로그에 대해 실행됨에 따라31N회 및 카운팅 세트 비트는 32비트의 경우 최대 O(32), 64비트의 경우 O(64) 및 각 하위 문자열 연산 O(31)을 차지합니다.

공간 복잡도: 오(1) 하위 문자열 작업에는 O(32) 공간이 필요합니다.

 
'
 

퀴즈 만들기