我陷入一个问题,即找到一个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)复杂度的算法。
答案 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;
}