给定一个大小为N的数组 arr[]和一个数组Q[] ,任务是计算数组 arr[]的所有元素与数组 q[] 的每个元素的按位异或之和。
例子:
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
朴素方法:解决问题的最简单方法是遍历数组Q[]并针对每个数组元素计算其与数组arr[] 的所有元素的按位异或之和。
时间复杂度: O(N 2 )
辅助空间: O(1)
高效方法:按照以下步骤优化上述方法:
- 初始化一个数组count[] ,大小为32 。在数组 arr[]的元素的每个位置存储设置位的计数。
- 遍历数组arr[] 。
- 相应地更新数组count[] 。在32 位二进制表示中,如果设置了第i位,则增加该位置的设置位计数。
- 遍历数组Q[]并对每个数组元素执行以下操作:
- 初始化变量,例如sum = 0,以存储按位 XOR 所需的总和。
- 迭代当前元素的每个位位置。
- 如果设置了当前位,则添加第i 位未设置的元素数* 2 i 求和。
- 否则,添加count[i] * 2 i 。
- 最后,打印sum的值。
下面是上述方法的实现:
C++
// C++ Program for the above approach
#include
using namespace std;
// Function to calculate sum of Bitwise
// XOR of elements of arr[] with k
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;
}
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 Code
int 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;
}
输出:
7 34 11
时间复杂度: O(N)
辅助空间: O(N)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live