// C++ Program to count all subarrays having
// XOR of elements as given value K using Hash Map
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
// Function to find the count of subarrays of arr
// with XOR value equals to k
int subarrayXor(vector<int>& arr, int k) {
int res = 0;
// Create hash map that stores number of prefix arrays
// corresponding to a XOR value
unordered_map<int, int> mp;
int prefXOR = 0;
for (int val : arr) {
// Find XOR of current prefix
prefXOR ^= val;
// If prefXOR ^ k exist in mp then there is a subarray
// ending at i with XOR equal to k
res = res + mp[prefXOR ^ k];
// If this prefix subarray has XOR equal to k
if (prefXOR == k)
res++;
// Add the XOR of this subarray to the map
mp[prefXOR]++;
}
// Return total count of subarrays having XOR of
// elements as given value k
return res;
}
int main() {
vector<int> arr = { 4, 2, 2, 6, 4 };
int k = 6;
cout << subarrayXor(arr, k);
return 0;
}
Ly8gQysrIFByb2dyYW0gdG8gY291bnQgYWxsIHN1YmFycmF5cyBoYXZpbmcKLy8gWE9SIG9mIGVsZW1lbnRzIGFzIGdpdmVuIHZhbHVlIEsgdXNpbmcgSGFzaCBNYXAKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIEZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvdW50IG9mIHN1YmFycmF5cyBvZiBhcnIgCi8vIHdpdGggWE9SIHZhbHVlIGVxdWFscyB0byBrCmludCBzdWJhcnJheVhvcih2ZWN0b3I8aW50PiYgYXJyLCBpbnQgaykgewogICAgaW50IHJlcyA9IDA7IAoKICAgIC8vIENyZWF0ZSBoYXNoIG1hcCB0aGF0IHN0b3JlcyBudW1iZXIgb2YgcHJlZml4IGFycmF5cwogICAgLy8gY29ycmVzcG9uZGluZyB0byBhIFhPUiB2YWx1ZQogICAgdW5vcmRlcmVkX21hcDxpbnQsIGludD4gbXA7CiAgCiAgCWludCBwcmVmWE9SID0gMDsKICAKICAgIGZvciAoaW50IHZhbCA6IGFycikgewogICAgICAKICAgICAgICAvLyBGaW5kIFhPUiBvZiBjdXJyZW50IHByZWZpeAogICAgICAgIHByZWZYT1IgXj0gdmFsOwoKICAgICAgICAvLyBJZiBwcmVmWE9SIF4gayBleGlzdCBpbiBtcCB0aGVuIHRoZXJlIGlzIGEgc3ViYXJyYXkgCiAgICAgIAkvLyBlbmRpbmcgYXQgaSB3aXRoIFhPUiBlcXVhbCB0byBrCiAgICAgICAgcmVzID0gcmVzICsgbXBbcHJlZlhPUiBeIGtdOwoKICAgICAgICAvLyBJZiB0aGlzIHByZWZpeCBzdWJhcnJheSBoYXMgWE9SIGVxdWFsIHRvIGsKICAgICAgICBpZiAocHJlZlhPUiA9PSBrKQogICAgICAgICAgICByZXMrKzsKCiAgICAgICAgLy8gQWRkIHRoZSBYT1Igb2YgdGhpcyBzdWJhcnJheSB0byB0aGUgbWFwCiAgICAgICAgbXBbcHJlZlhPUl0rKzsKICAgIH0KCiAgICAvLyBSZXR1cm4gdG90YWwgY291bnQgb2Ygc3ViYXJyYXlzIGhhdmluZyBYT1Igb2YKICAgIC8vIGVsZW1lbnRzIGFzIGdpdmVuIHZhbHVlIGsKICAgIHJldHVybiByZXM7Cn0KCmludCBtYWluKCkgewogICAgdmVjdG9yPGludD4gYXJyID0geyA0LCAyLCAyLCA2LCA0IH07CiAgICBpbnQgayA9IDY7CgogICAgY291dCA8PCBzdWJhcnJheVhvcihhcnIsIGspOwogICAgcmV0dXJuIDA7Cn0K