# Number of ways to change the XOR of two numbers by swapping the bits

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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach:

1. Count the number of 1’s and 0’s in s1.
2. 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.
3. For the first case, the number of ways of replacement will be the number of ones-already used 1’s.
4. For the second case, the number of ways of replacement will be the number of zeros-already used 0’s.
5. summation of number of ways in both the cases will be the answer.

Below is the implementation of the above approach:

## C++

 `#include ` `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

 ` `

Output:

```4
```

Time Complexity: O(N)

My Personal Notes arrow_drop_up

Striver(underscore)79 at Codechef and codeforces D

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.

Article Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.