Given an array arr[] of measurement N and an integer Okay, the duty is to seek out the rely of all of the ordered pairs (i, j) the place i != j, such that ((arr[i] ⊕ arr[j]) & Okay) = 0. The ⊕ represents bitwise XOR and & represents bitwise AND.
Examples:
Enter: arr = [1, 2, 3, 4, 5], Okay = 3
Output: 2
Clarification: There are 2 pairs satisfying the situation.
These pairs are: (1, 5) and (5, 1)Enter: arr = [5, 9, 24], Okay = 7
Output: 0
Clarification: No such pair satisfying the situation exists.
Method: The given drawback might be solved with the assistance of the next concept:
Utilizing distributive property, we will write ((arr[i] ⊕ arr[j]) & Okay) = ((arr[i] & Okay) ⊕ (arr[j] & Okay)).
Since for ((arr[i] & Okay) ⊕ (arr[j] & Okay)) = 0, these two phrases (arr[i] & Okay) and (arr[j] & Okay) have to be equal.
Comply with the beneath steps to resolve the issue:
- Create a map and a solution variable (say Res = 0).
- Traverse the array and insert (arr[i] & Okay) to map with its rely.
- Now, traverse the map and for every entry if there are X such occurrences then doable pairs = X*(X-1). So add that to the worth Res.
- Return Res because the required reply.
Under is the implementation of the above strategy:
C++
|
Time Complexity: O(N)
Auxiliary Area: O(N)