[ad_1]
Given an array arr[] of dimension N and an integer Okay, the duty is to search 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
Rationalization: There are 2 pairs satisfying the situation.
These pairs are: (1, 5) and (5, 1)Enter: arr = [5, 9, 24], Okay = 7
Output: 0
Rationalization: No such pair satisfying the situation exists.
Method: The given drawback may be solved with the assistance of the next concept:
Utilizing distributive property, we are able to 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.
Observe the under steps to unravel 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.
Beneath is the implementation of the above method:
C++
|
Time Complexity: O(N)
Auxiliary House: O(N)
[ad_2]