Sum of Bitwise XOR of elements of an array with all elements of another array

Given an array arr[] of size N and an array Q[], the task is to calculate the sum of Bitwise XOR of all elements of the array arr[] with each element of the array q[].
Examples:
Input: arr[ ] = {5, 2, 3}, Q[ ] = {3, 8, 7}
Output: 7 34 11
Explanation:
For Q[0] ( = 3): Sum = 5 ^ 3 + 2 ^ 3 + 3 ^ 3 = 7.
For Q[1] ( = 8): Sum = 5 ^ 8 + 2 ^ 8 + 3 ^ 8 = 34.
For Q[2] ( = 7): Sum = 5 ^ 7 + 2 ^ 7 + 3 ^ 7 = 11.Input: arr[ ] = {2, 3, 4}, Q[ ] = {1, 2}
Output: 10 7
Naive Approach: The simplest approach to solve the problem is to traverse the array Q[] and for each array element, calculate the sum of its Bitwise XOR with all elements of the array arr[].
Time Complexity: O(N2)
Auxiliary Space: O(1)
Efficient Approach: Follow the steps below to optimize the above approach:
- Initialize an array count[], of size 32. to store the count of set bits at each position of the elements of the array arr[].
- Traverse the array arr[].
- Update the array count[] accordingly. In a 32-bit binary representation, if the ith bit is set, increase the count of set bits at that position.
- Traverse the array Q[] and for each array element, perform the following operations:
- Initialize variables, say sum = 0, to store the required sum of Bitwise XOR .
- Iterate over each bit positions of the current element.
- If current bit is set, add count of elements with ith bit not set * 2i to sum.
- Otherwise, add count[i] * 2i.
- Finally, print the value of sum.
Below is the implementation of the above approach:
C++
// C++ Program for the above approach#include <bits/stdc++.h>using namespace std;// Function to calculate sum of Bitwise// XOR of elements of arr[] with kint xorSumOfArray(int arr[], int n, int k, int count[]){ // Initialize sum to be zero int sum = 0; int p = 1; // Iterate over each set bit for (int i = 0; i < 31; i++) { // Stores contribution of // i-th bet to the sum int val = 0; // If the i-th bit is set if ((k & (1 << i)) != 0) { // Stores count of elements // whose i-th bit is not set int not_set = n - count[i]; // Update value val = ((not_set)*p); } else { // Update value val = (count[i] * p); } // Add value to sum sum += val; // Move to the next // power of two p = (p * 2); } return sum;}void sumOfXors(int arr[], int n, int queries[], int q){ // Stores the count of elements // whose i-th bit is set int count[32]; // Initialize count to 0 // for all positions memset(count, 0, sizeof(count)); // Traverse the array for (int i = 0; i < n; i++) { // Iterate over each bit for (int j = 0; j < 31; j++) { // If the i-th bit is set if (arr[i] & (1 << j)) // Increase count count[j]++; } } for (int i = 0; i < q; i++) { int k = queries[i]; cout << xorSumOfArray(arr, n, k, count) << " "; }}// Driver Codeint main(){ int arr[] = { 5, 2, 3 }; int queries[] = { 3, 8, 7 }; int n = sizeof(arr) / sizeof(int); int q = sizeof(queries) / sizeof(int); sumOfXors(arr, n, queries, q); return 0;} |
Java
// Java Program for the above approachimport java.util.Arrays;class GFG{// Function to calculate sum of Bitwise// XOR of elements of arr[] with kstatic int xorSumOfArray(int arr[], int n, int k, int count[]){ // Initialize sum to be zero int sum = 0; int p = 1; // Iterate over each set bit for(int i = 0; i < 31; i++) { // Stores contribution of // i-th bet to the sum int val = 0; // If the i-th bit is set if ((k & (1 << i)) != 0) { // Stores count of elements // whose i-th bit is not set int not_set = n - count[i]; // Update value val = ((not_set)*p); } else { // Update value val = (count[i] * p); } // Add value to sum sum += val; // Move to the next // power of two p = (p * 2); } return sum;}static void sumOfXors(int arr[], int n, int queries[], int q){ // Stores the count of elements // whose i-th bit is set int []count = new int[32]; // Initialize count to 0 // for all positions Arrays.fill(count,0); // Traverse the array for(int i = 0; i < n; i++) { // Iterate over each bit for(int j = 0; j < 31; j++) { // If the i-th bit is set if ((arr[i] & (1 << j)) != 0) // Increase count count[j]++; } } for(int i = 0; i < q; i++) { int k = queries[i]; System.out.print( xorSumOfArray(arr, n, k, count) + " "); }}// Driver Codepublic static void main(String args[]){ int arr[] = { 5, 2, 3 }; int queries[] = { 3, 8, 7 }; int n = arr.length; int q = queries.length; sumOfXors(arr, n, queries, q);}}// This code is contributed by SoumikMondal |
Python3
# Python3 Program for the above approach# Function to calculate sum of Bitwise# XOR of elements of arr[] with kdef xorSumOfArray(arr, n, k, count): # Initialize sum to be zero sum = 0 p = 1 # Iterate over each set bit for i in range(31): # Stores contribution of # i-th bet to the sum val = 0 # If the i-th bit is set if ((k & (1 << i)) != 0): # Stores count of elements # whose i-th bit is not set not_set = n - count[i] # Update value val = ((not_set)*p) else: # Update value val = (count[i] * p) # Add value to sum sum += val # Move to the next # power of two p = (p * 2) return sumdef sumOfXors(arr, n, queries, q): # Stores the count of elements # whose i-th bit is set count = [0 for i in range(32)] # Traverse the array for i in range(n): # Iterate over each bit for j in range(31): # If the i-th bit is set if (arr[i] & (1 << j)): # Increase count count[j] += 1 for i in range(q): k = queries[i] print(xorSumOfArray(arr, n, k, count), end = " ")# Driver Codeif __name__ == '__main__': arr = [ 5, 2, 3 ] queries = [ 3, 8, 7 ] n = len(arr) q = len(queries) sumOfXors(arr, n, queries, q)# This code is contributed by SURENDRA_GANGWAR |
C#
// C# Program for the above approachusing System;public class GFG{ // Function to calculate sum of Bitwise// XOR of elements of arr[] with kstatic int xorSumOfArray(int []arr, int n, int k, int []count){ // Initialize sum to be zero int sum = 0; int p = 1; // Iterate over each set bit for (int i = 0; i < 31; i++) { // Stores contribution of // i-th bet to the sum int val = 0; // If the i-th bit is set if ((k & (1 << i)) != 0) { // Stores count of elements // whose i-th bit is not set int not_set = n - count[i]; // Update value val = ((not_set)*p); } else { // Update value val = (count[i] * p); } // Add value to sum sum += val; // Move to the next // power of two p = (p * 2); } return sum;}static void sumOfXors(int []arr, int n, int []queries, int q){ // Stores the count of elements // whose i-th bit is set int []count = new int[32]; // Initialize count to 0 // for all positions for(int i = 0; i < 32; i++) count[i] = 0; // Traverse the array for (int i = 0; i < n; i++) { // Iterate over each bit for (int j = 0; j < 31; j++) { // If the i-th bit is set if ((arr[i] & (1 << j)) != 0) // Increase count count[j]++; } } for (int i = 0; i < q; i++) { int k = queries[i]; Console.Write(xorSumOfArray(arr, n, k, count) + " "); }}// Driver Codestatic public void Main (){ int []arr = { 5, 2, 3 }; int []queries = { 3, 8, 7 }; int n = arr.Length; int q = queries.Length; sumOfXors(arr, n, queries, q);}}// This code is contributed by AnkThon |
Javascript
<script>// Javascript program for the above approach// Function to calculate sum of Bitwise// XOR of elements of arr[] with kfunction xorSumOfArray(arr, n, k, count){ // Initialize sum to be zero var sum = 0; var p = 1; // Iterate over each set bit for(var i = 0; i < 31; i++) { // Stores contribution of // i-th bet to the sum var val = 0; // If the i-th bit is set if ((k & (1 << i)) != 0) { // Stores count of elements // whose i-th bit is not set var not_set = n - count[i]; // Update value val = ((not_set)*p); } else { // Update value val = (count[i] * p); } // Add value to sum sum += val; // Move to the next // power of two p = (p * 2); } return sum;}function sumOfXors(arr, n, queries, q){ // Stores the count of elements // whose i-th bit is set var count = new Array(32); // Initialize count to 0 // for all positions count.fill(0); // Traverse the array for(var i = 0; i < n; i++) { // Iterate over each bit for(var j = 0; j < 31; j++) { // If the i-th bit is set if (arr[i] & (1 << j)) // Increase count count[j]++; } } for(var i = 0; i < q; i++) { var k = queries[i]; document.write(xorSumOfArray( arr, n, k, count) + " "); }}// Driver codevar arr = [ 5, 2, 3 ];var queries = [ 3, 8, 7 ];var n = arr.length;var q = queries.length;sumOfXors(arr, n, queries, q);// This code is contributed by SoumikMondal</script> |
7 34 11
Time Complexity: O(N)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



