Given two binary strings s1 and s2. The XOR of them is X, the task is to find the number of ways to swap two-bit positions in string s1 such that XOR formed between new s1 and s2 is not same as X.
Examples:
Input: s1 = “01011”, s2 = “11001”
Output: 4
swap bits of index(1-based) (1, 4), (2, 3), (3, 4), or (3, 5) such that XOR value is changed.
Input: s1 = “011000”, s2 = “010011”
Output: 6
Approach:
- Count the number of 1’s and 0’s in s1.
- Traverse in the string s1, and check for two cases:
- 0 and 0 in s1[i] and s2[i], as replacing 0 with 1, will change the XOR value.
- 1 and 0 in s1[i] and s2[i], as replacing 1 with 0 will change the XOR value.
- For the first case, the number of ways of replacement will be the number of ones-already used 1’s.
- For the second case, the number of ways of replacement will be the number of zeros-already used 0’s.
- summation of number of ways in both the cases will be the answer.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h> using namespace std;
// Function that returns the number of // bit swaps such that xor is different int countWays(string s1, string s2)
{ int c1 = 0, c0 = 0;
int n = s1.length();
// traverse and count 1's and 0's
for ( int i = 0; i < n; i++) {
if (s1[i] == '1' )
c1++;
else
c0++;
}
int used1 = 0, used0 = 0;
int ways = 0;
// traverse in the string
for ( int i = 0; i < n; i++) {
// if both positions are 0
if (s1[i] == '0' and s2[i] == '0' ) {
// add the number of ones as
// it will change the XOR
ways += c1;
// subtract the number of ones already used
ways -= used1;
// zeros have been used
used0++;
}
// when 1 and 0, to change XOR, we have to
// replace 1 by 0
else if (s1[i] == '1' and s2[i] == '0' ) {
// add number of 0's
ways += c0;
// subtract number of 0's already used
ways -= used0;
// count 1's used
used1++;
}
}
// return the answer
return ways;
} // Driver Code int main()
{ string s1 = "01011" ;
string s2 = "11001" ;
cout << countWays(s1, s2);
return 0;
} |
Java
// Java Program to find Number of // ways to change the XOR of two // numbers by swapping the bits class GFG
{ // Function that returns the // number of bit swaps such // that xor is different static int countWays(String s1,
String s2)
{ int c1 = 0 , c0 = 0 ;
int n = s1.length();
// traverse and count 1's and 0's
for ( int i = 0 ; i < n; i++)
{
if (s1.charAt(i) == '1' )
c1++;
else
c0++;
}
int used1 = 0 , used0 = 0 ;
int ways = 0 ;
// traverse in the String
for ( int i = 0 ; i < n; i++)
{
// if both positions are 0
if (s1.charAt(i) == '0' &&
s2.charAt(i) == '0' )
{
// add the number of ones as
// it will change the XOR
ways += c1;
// subtract the number of
// ones already used
ways -= used1;
// zeros have been used
used0++;
}
// when 1 and 0, to change XOR,
// we have to replace 1 by 0
else if (s1.charAt(i) == '1' &&
s2.charAt(i) == '0' )
{
// add number of 0's
ways += c0;
// subtract number of
// 0's already used
ways -= used0;
// count 1's used
used1++;
}
}
// return the answer
return ways;
} // Driver Code public static void main(String[] args)
{ String s1 = "01011" ;
String s2 = "11001" ;
System.out.println(countWays(s1, s2));
} } // This code is contributed // by Arnab Kundu |
Python3
# Function that returns the number of # bit swaps such that xor is different def countWays(s1, s2):
c1 = 0
c0 = 0
n = len (s1)
# traverse and count 1's and 0's
for i in range ( 0 ,n) :
if (s1[i] = = '1' ):
c1 + = 1
else :
c0 + = 1
used1 = 0
used0 = 0
ways = 0
# traverse in the string
for i in range ( 0 ,n) :
# if both positions are 0
if (s1[i] = = '0' and s2[i] = = '0' ) :
# add the number of ones as
# it will change the XOR
ways + = c1
# subtract the number of ones already used
ways - = used1
# zeros have been used
used0 + = 1
# when 1 and 0, to change XOR, we have to
# replace 1 by 0
elif (s1[i] = = '1' and s2[i] = = '0' ) :
# add number of 0's
ways + = c0
# subtract number of 0's already used
ways - = used0
# count 1's used
used1 + = 1
# return the answer
return ways
# Driver Code if __name__ = = '__main__' :
s1 = "01011"
s2 = "11001"
print (countWays(s1, s2))
# This code is contributed by Smitha Dinesh Semwal |
C#
// C# Program to find Number of // ways to change the XOR of two // numbers by swapping the bits using System;
class GFG
{ // Function that returns the // number of bit swaps such // that xor is different static int countWays(String s1,
String s2)
{ int c1 = 0, c0 = 0;
int n = s1.Length;
// traverse and count 1's and 0's
for ( int i = 0; i < n; i++)
{
if (s1[i] == '1' )
c1++;
else
c0++;
}
int used1 = 0, used0 = 0;
int ways = 0;
// traverse in the String
for ( int i = 0; i < n; i++)
{
// if both positions are 0
if (s1[i] == '0' &&
s2[i] == '0' )
{
// add the number of ones as
// it will change the XOR
ways += c1;
// subtract the number of
// ones already used
ways -= used1;
// zeros have been used
used0++;
}
// when 1 and 0, to change XOR,
// we have to replace 1 by 0
else if (s1[i] == '1' &&
s2[i] == '0' )
{
// add number of 0's
ways += c0;
// subtract number of
// 0's already used
ways -= used0;
// count 1's used
used1++;
}
}
// return the answer
return ways;
} // Driver Code public static void Main(String[] args)
{ String s1 = "01011" ;
String s2 = "11001" ;
Console.WriteLine(countWays(s1, s2));
} } // This code is contributed // by Subhadeep Gupta |
PHP
<?php // Function that returns the // number of bit swaps such // that xor is different function countWays( $s1 , $s2 )
{ $c1 = 0;
$c0 = 0;
$n = strlen ( $s1 );
// traverse and count 1's and 0's
for ( $i = 0; $i < $n ; $i ++)
{
if ( $s1 [ $i ] == '1' )
$c1 ++;
else
$c0 ++;
}
$used1 = 0;
$used0 = 0;
$ways = 0;
// traverse in the string
for ( $i = 0; $i < $n ; $i ++)
{
// if both positions are 0
if ( $s1 [ $i ] == '0' and
$s2 [ $i ] == '0' )
{
// add the number of ones as
// it will change the XOR
$ways += $c1 ;
// subtract the number of
// ones already used
$ways -= $used1 ;
// zeros have been used
$used0 ++;
}
// when 1 and 0, to change XOR,
// we have to replace 1 by 0
else if ( $s1 [ $i ] == '1' and
$s2 [ $i ] == '0' )
{
// add number of 0's
$ways += $c0 ;
// subtract number of 0's
// already used
$ways -= $used0 ;
// count 1's used
$used1 ++;
}
}
// return the answer
return $ways ;
} // Driver Code $s1 = "01011" ;
$s2 = "11001" ;
echo countWays( $s1 , $s2 );
// This code is contributed // by Shivi_Aggarwal ?> |
Javascript
<script> // Function that returns the number of // bit swaps such that xor is different function countWays(s1, s2)
{ let c1 = 0, c0 = 0;
let n = s1.length;
// traverse and count 1's and 0's
for (let i = 0; i < n; i++) {
if (s1[i] == '1' )
c1++;
else
c0++;
}
let used1 = 0, used0 = 0;
let ways = 0;
// traverse in the string
for (let i = 0; i < n; i++) {
// if both positions are 0
if (s1[i] == '0' && s2[i] == '0' ) {
// add the number of ones as
// it will change the XOR
ways += c1;
// subtract the number of ones already used
ways -= used1;
// zeros have been used
used0++;
}
// when 1 and 0, to change XOR, we have to
// replace 1 by 0
else if (s1[i] == '1' && s2[i] == '0' ) {
// add number of 0's
ways += c0;
// subtract number of 0's already used
ways -= used0;
// count 1's used
used1++;
}
}
// return the answer
return ways;
} // Driver Code let s1 = "01011" ;
let s2 = "11001" ;
document.write(countWays(s1, s2));
</script> |
Output:
4
Time Complexity: O(N)
Auxiliary Space: O(1)