C++ 查询所有子数组的 XOR 的 XOR

c++server side programmingprogramming

计算给定范围内所有子数组的 XOR 并打印。例如

输入:arr[] = { 4, 1, 2, 3, 5 }, Q = 3

查询

q1 = { 1, 2 }
q2 = { 2, 4 }
q3 = { 1, 4 }

输出:0
2
0
解释:根据给定的问题,我们需要找到给定范围内所有子数组的异或,因此对于查询 2,子数组为:
{1}, {2}, {3}, {1, 2}, {2, 3}, (1, 2, 3}
因此,您可以看到元素出现的次数为:
1 出现 3 次
2 出现 4 次
3 出现 3 次
现在我们知道异或的性质是出现偶数次的数字会被抵消,因此2 被抵消了,只剩下 3 和 1 的异或,这就是我们的答案。

我们需要观察这个问题中形成的模式,然后我们需要相应地实现它。

寻找解决方案的方法

在这个问题中,我们试图找到问题中存在的中间模式。当。当我们看到那个模式时,我们会相应地实现它并检查结果。

示例

上述方法的 C++ 代码

 
#include <bits/stdc++.h>
using namespace std;
void ansQueries(int prefeven[], int prefodd[], int l, int r){
    if ((r - l + 1) % 2 == 0) // 如果范围内存在的元素数量为偶数
        cout << &";0";
    else{
          if (l % 2 == 0) // 如果 l 为偶数
            cout << (prefeven[r] ^ prefeven[l - 1]) << &";\n";
        else // 如果 l 为奇数
            cout << (prefodd[r] ^ prefodd[l - 1]) << "\n";
    }
}
int main(){
    int arr[] = {4, 1, 2, 3, 5};
    int n = sizeof(arr) / sizeof(int); // 数组的大小
    int l[] = {1, 2, 1}; // 给定查询的左索引
    int r[] = {2, 4, 4}; // 给定查询的右索引
    int q = sizeof(l) / sizeof(int);         // 询问的查询数
    int prefodd[n] = {0}, prefeven[n] = {0}; // 偶数和奇数索引的不同前缀异或
    for (int i = 1; i <= n; i++){
          if ((i) % 2 == 0){ // 如果 i 为偶数,则我们更改 prefeven
            prefeven[i] = arr[i - 1] ^ prefeven[i - 1];
            prefodd[i] = prefodd[i - 1];
        }else{
            prefeven[i] = prefeven[i - 1];
            prefodd[i] = prefodd[i - 1] ^ arr[i - 1];
        }
    }
    for (int i = 0; i < q; i++){
        ansQueries(prefeven, prefodd, l[i], r[i]);
    }
    return 0;
}

输出

02
0

上述代码的解释

在这种方法中,我们首先观察到,如果范围的大小是偶数,那么我们的答案将为零,因为每个数字都会出现偶数次,当我们打印所有子数组时,因此通过对它们进行异或,答案将为 0,现在对于我们下一部分的范围大小为奇数,在这种情况下,出现奇数次的数字在给定范围内处于偶数位置,我们的答案将只是在给定范围内偶数位置出现的数字的异或,我们维护两个前缀数组,其中包含交替位置的异或,因为我们的 prefeven 包含所有偶数索引的异或,而 prefodd 包含所有奇数索引的异或,现在当我们解决查询时,我们只需要检查我们的 l 是偶数还是奇数并给出答案相应地。

结论

在本教程中,我们解决了一个问题,即解决所有子数组的 XOR 的 XOR 查询。我们还学习了这个问题的 C++ 程序以及我们解决这个问题的完整方法(正常)。我们可以用其他语言(如 C、java、python 和其他语言)编写相同的程序。我们希望您觉得本教程有用。


相关文章