Given an integer array, arr[] of size N. The XOR value of any subarray of arr[] is defined as the xor of all the integers in that subarray. The task is to find the number of sub-arrays with XOR value a power of 2. (1, 2, 4, 8, 16, ….)
Examples: 
 
Input :  arr[] = {2, 6, 7, 5, 8}
Output : 6
Subarrays : {2, 6}, {2}, {6, 7},  {6, 7, 5}, {7, 5}, {8}
Input : arr[] = {2, 4, 8, 16} 
Output : 4 
Approach : 
 
- Maintain a hashmap which stores all the prefix XOR values and their counts.
 - At any index i, we need to find the number of subarrays which end at i and have XOR value a power of 2. We need to find for all the power of 2, the number of subarrays possible. For example. : Suppose current XOR value till index i is X, we need to find the number of subarrays which result in 16 (say S), so we need the count of prefix XOR Y such that (X^Y) = S or Y = S^X. Y can be find using Hash Map.
 - Perform Step 2, for all the index, add the output.
 
Below is the implementation of the above approach: 
 
C++
// C++ Program to count number of subarrays // with Bitwise-XOR as power of 2#include <bits/stdc++.h>#define ll long long int#define MAX 10using namespace std;// Function to find number of subarraysint findSubarray(int array[], int n){    // Hash Map to store prefix XOR values    unordered_map<int, int> mp;    // When no element is selected    mp.insert({ 0, 1 });    int answer = 0;    int preXor = 0;    for (int i = 0; i < n; i++) {        int value = 1;        preXor ^= array[i];        // Check for all the powers of 2,         // till a MAX value        for (int j = 1; j <= MAX; j++) {            int Y = value ^ preXor;            if (mp.find(Y) != mp.end()) {                answer += mp[Y];            }            value *= 2;        }        // Insert Current prefixxor in Hash Map        if (mp.find(preXor) != mp.end()) {            mp[preXor]++;        }        else {            mp.insert({ preXor, 1 });        }    }    return answer;}// Driver Codeint main(){    int array[] = { 2, 6, 7, 5, 8 };         int n = sizeof(array) / sizeof(array[0]);         cout << findSubarray(array, n) << endl;    return 0;} | 
Java
// Java Program to count number of subarrays // with Bitwise-XOR as power of 2import java.util.*;class GFG{static int MAX = 10;// Function to find number of subarraysstatic int findSubarray(int array[], int n){    // Hash Map to store prefix XOR values    HashMap<Integer,            Integer> mp = new HashMap<Integer,                                      Integer>();    // When no element is selected    mp.put(0, 1);    int answer = 0;    int preXor = 0;    for (int i = 0; i < n; i++)     {        int value = 1;        preXor ^= array[i];        // Check for all the powers of 2,         // till a MAX value        for (int j = 1; j <= MAX; j++)         {            int Y = value ^ preXor;            if (mp.containsKey(Y))             {                answer += mp.get(Y);            }            value *= 2;        }        // Insert Current prefixxor in Hash Map        if (mp.containsKey(preXor))         {            mp.put(preXor,mp.get(preXor) + 1);        }        else        {            mp.put(preXor, 1);        }    }    return answer;}// Driver Codepublic static void main (String[] args){    int array[] = { 2, 6, 7, 5, 8 };         int n = array.length;         System.out.println(findSubarray(array, n));}}// This code is contributed by PrinciRaj1992 | 
Python3
# Python3 Program to count number of subarrays# with Bitwise-XOR as power of 2MAX = 10# Function to find number of subarraysdef findSubarray(array, n):         # Hash Map to store prefix XOR values    mp = dict()    # When no element is selected    mp[0] = 1    answer = 0    preXor = 0    for i in range(n):        value = 1        preXor ^= array[i]        # Check for all the powers of 2,        # till a MAX value        for j in range(1, MAX + 1):            Y = value ^ preXor            if ( Y in mp.keys()):                answer += mp[Y]            value *= 2        # Insert Current prefixxor in Hash Map        if (preXor in mp.keys()):            mp[preXor] += 1        else:            mp[preXor] = 1    return answer# Driver Codearray = [2, 6, 7, 5, 8]n = len(array)print(findSubarray(array, n))# This code is contributed by Mohit Kumar | 
C#
// C# Program to count number of subarrays // with Bitwise-XOR as power of 2using System;using System.Collections.Generic;class GFG{static int MAX = 10;// Function to find number of subarraysstatic int findSubarray(int []array, int n){    // Hash Map to store prefix XOR values    Dictionary<int,               int> mp = new Dictionary<int,                                        int>();    // When no element is selected    mp.Add(0, 1);    int answer = 0;    int preXor = 0;    for (int i = 0; i < n; i++)     {        int value = 1;        preXor ^= array[i];        // Check for all the powers of 2,         // till a MAX value        for (int j = 1; j <= MAX; j++)         {            int Y = value ^ preXor;            if (mp.ContainsKey(Y))             {                answer += mp[Y];            }            value *= 2;        }        // Insert Current prefixxor in Hash Map        if (mp.ContainsKey(preXor))         {            mp[preXor] = mp[preXor] + 1;        }        else        {            mp.Add(preXor, 1);        }    }    return answer;}// Driver Codepublic static void Main (String[] args){    int []array = { 2, 6, 7, 5, 8 };         int n = array.Length;         Console.WriteLine(findSubarray(array, n));}}     // This code is contributed by 29AjayKumar | 
Javascript
<script>// Javascript Program to count number of subarrays // with Bitwise-XOR as power of 2var MAX = 10;// Function to find number of subarraysfunction findSubarray(array, n){    // Hash Map to store prefix XOR values    var mp = new Map();    // When no element is selected    mp.set(0,1);    var answer = 0;    var preXor = 0;    for (var i = 0; i < n; i++) {        var value = 1;        preXor ^= array[i];        // Check for all the powers of 2,         // till a MAX value        for (var j = 1; j <= MAX; j++) {            var Y = value ^ preXor;            if (mp.has(Y)) {                answer += mp.get(Y);            }            value *= 2;        }        // Insert Current prefixxor in Hash Map        if (mp.has(preXor)) {            mp.set(preXor, mp.get(preXor)+1);        }        else {            mp.set(preXor,1);        }    }    return answer;}// Driver Codevar array = [2, 6, 7, 5, 8 ];var n = array.length;document.write( findSubarray(array, n));</script> | 
6
Time Complexity: O(n * MAX)
Auxiliary Space: O(n)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
