查找xor为0的子数组

时间:2019-08-04 06:06:02

标签: algorithm bit-manipulation xor trie bitwise-xor

我陷入一个问题,即找到一个xor为0的子数组。 我在某处读到可以使用TRIE数据结构来完成此操作,但我想要数组的开始和结束索引。

例如,考虑一个数组

a = [3,6,13,8 15]

从0到3的子数组,即[3,6,13,8]的xor等于0。 (3 xor 6 xor 13 xor 8 = 0) 我正在寻找一种算法,无法找到那些索引(在这种情况下为[0,3])。

详细的答案将非常有帮助。

更新 我尝试了蛮力方法来检查所有[i,j]对的xor。由于没有,所以给了TLE。数组中的元素数量最多可达10 ^ 5

我尝试了提及here的解决方案,但这没有给出索引。

我正在寻找具有O(nLogn)或O(n)复杂度的算法。

1 个答案:

答案 0 :(得分:1)

此解决方案还具有O(n)的复杂性。充分利用unordered_map

vector<int> a = {3,6,13,8,15};
unordered_map<int, int> hashMap;
int number_of_elements = a.size();
hashMap[0] = -1;
int xor_sum = 0;
for(int i = 0; i < number_of_elements; i++) {
    xor_sum ^= a[i];
    if(hashMap.find(xorSum) != hashMap.end()) {
        cout << hashMap[xorSum] + 1 << " " << i << endl;
        break;
    }
    hashMap[xor_sum] = i;
}