Number of ways to swap two bit of s1 so that bitwise OR of s1 and s2 changes

Given two binary numbers strings s1 and s2 of length N. Find the number of ways of swapping two bits in s1(only s1 not s2) so that bit-wise OR of these two numbers s1 and s2 are changed.

Note: The length of both string must be equal, you can take leading zeros in case of different length.

Example:

Input: s1 = "01011", s2 = "11001"
Output: 4
Explanation:
You can swap the bit of s1 at indexed:
(1, 4), (2, 3), (3, 4) and (3, 5)
there are 4 ways possible.

Input: s1 = "011000", s2 = "010011"
Output: 6

Approach: Initialize a variable result as zero that stores number of ways to swap bits of s1 so that bitwise OR of s1 and s2 changes. Initialize four variables say a, b, c, and d as zero.

Traverse both strings from left side and check for the below conditions to increment values of the
variable declared above:

  • If the current bit of both s1 and s2 are zero, increment c.
  • If current bit of s2 is zero and s1 is one, increment d.
  • If current bit of s2 is one and s1 is zero, increment a.
  • If current bit of both s1 and s2 is one, increment b.

Update the result by (a*d) + (b*c) + (c*d) and return the result.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find no of ways
// to swap bits of s1 so that
// bitwise OR of s1 and s2 changes
#include <iostream>
using namespace std;
  
// Function to find number of ways
int countWays(string s1, string s2, int n)
{
  
    int a, b, c, d;
    a = b = c = d = 0;
  
    // intialise result that store
    // No. of swaps required
    int result = 0;
  
    // Traverse both strings and check
    // the bits as explained
    for (int i = 0; i < n; i++) {
        if (s2[i] == '0') {
            if (s1[i] == '0') {
                c++;
            }
            else {
                d++;
            }
        }
        else {
            if (s1[i] == '0') {
                a++;
            }
            else {
                b++;
            }
        }
    }
  
    // calculate result
    result = a * d + b * c + c * d;
  
    return result;
}
  
// Driver code
int main()
{
    int n = 5;
    string s1 = "01011";
    string s2 = "11001";
  
    cout << countWays(s1, s2, n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find no of ways
// to swap bits of s1 so that
// bitwise OR of s1 and s2 changes
import java.io.*;
  
class GFG {
    
  
  
// Function to find number of ways
static int countWays(String s1, String s2, int n)
{
  
    int a, b, c, d;
    a = b = c = d = 0;
  
    // intialise result that store
    // No. of swaps required
    int result = 0;
  
    // Traverse both strings and check
    // the bits as explained
    for (int i = 0; i < n; i++) {
        if (s2.charAt(i) == '0') {
            if (s1.charAt(i) == '0') {
                c++;
            }
            else {
                d++;
            }
        }
        else {
            if (s1.charAt(i) == '0') {
                a++;
            }
            else {
                b++;
            }
        }
    }
  
    // calculate result
    result = a * d + b * c + c * d;
  
    return result;
}
  
// Driver code
  
    public static void main (String[] args) {
        int n = 5;
    String s1 = "01011";
    String s2 = "11001";
  
    System.out.println(countWays(s1, s2, n));
    }
}
// This code is contributed by shs..

chevron_right


Python3

# Python 3 program to find no of ways
# to swap bits of s1 so that
# bitwise OR of s1 and s2 changes

# Function to find number of ways
def countWays(s1, s2, n):
a = b = c = d = 0

# intialise result that store
# No. of swaps required
result = 0;

# Traverse both strings and check
# the bits as explained
for i in range(0, n, 1):
if (s2[i] == ‘0’):
if (s1[i] == ‘0’):
c += 1;

else:
d += 1
else:
if (s1[i] == ‘0’):
a += 1

else:
b += 1

# calculate result
result = a * d + b * c + c * d

return result

# Driver code
if __name__ == ‘__main__’:
n = 5
s1 = “01011”
s2 = “11001”

print(countWays(s1, s2, n))

# This code is contributed by
# Surendra_Gangwar

C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find no of ways
// to swap bits of s1 so that
// bitwise OR of s1 and s2 changes
using System;
  
class GFG {
  
  
  
// Function to find number of ways
static int countWays(string s1, string s2, int n)
{
  
    int a, b, c, d;
    a = b = c = d = 0;
  
    // intialise result that store
    // No. of swaps required
    int result = 0;
  
    // Traverse both strings and check
    // the bits as explained
    for (int i = 0; i < n; i++) {
        if (s2[i] == '0') {
            if (s1[i] == '0') {
                c++;
            }
            else {
                d++;
            }
        }
        else {
            if (s1[i] == '0') {
                a++;
            }
            else {
                b++;
            }
        }
    }
  
    // calculate result
    result = a * d + b * c + c * d;
  
    return result;
}
  
// Driver code
  
    public static void Main () {
        int n = 5;
    string s1 = "01011";
    string s2 = "11001";
  
    Console.WriteLine(countWays(s1, s2, n));
    }
}
// This code is contributed by shs..

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find no of ways
// to swap bits of s1 so that
// bitwise OR of s1 and s2 changes
  
// Function to find number of ways
function countWays($s1, $s2, $n)
{
    $a = $b = $c = $d = 0;
  
    // intialise result that store
    // No. of swaps required
    $result = 0;
  
    // Traverse both strings and check
    // the bits as explained
    for ($i = 0; $i < $n; $i++) 
    {
        if ($s2[$i] == '0'
        {
            if ($s1[$i] == '0'
            {
                $c++;
            }
            else 
            {
                $d++;
            }
        }
        else
        {
            if ($s1[$i] == '0'
            {
                $a++;
            }
            else 
            {
                $b++;
            }
        }
    }
  
    // calculate result
    $result = $a * $d + $b
              $c + $c * $d;
  
    return $result;
}
  
// Driver code
$n = 5;
$s1 = "01011";
$s2 = "11001";
echo countWays($s1, $s2, $n);
  
// This code is contributed by ajit
?>

chevron_right


Output:

4


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.