Find number of subarrays with XOR value a power of 2
Last Updated :
12 Nov, 2021
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++
#include <bits/stdc++.h>
#define ll long long int
#define MAX 10
using namespace std;
int findSubarray( int array[], int n)
{
unordered_map< int , int > mp;
mp.insert({ 0, 1 });
int answer = 0;
int preXor = 0;
for ( int i = 0; i < n; i++) {
int value = 1;
preXor ^= array[i];
for ( int j = 1; j <= MAX; j++) {
int Y = value ^ preXor;
if (mp.find(Y) != mp.end()) {
answer += mp[Y];
}
value *= 2;
}
if (mp.find(preXor) != mp.end()) {
mp[preXor]++;
}
else {
mp.insert({ preXor, 1 });
}
}
return answer;
}
int main()
{
int array[] = { 2, 6, 7, 5, 8 };
int n = sizeof (array) / sizeof (array[0]);
cout << findSubarray(array, n) << endl;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int MAX = 10 ;
static int findSubarray( int array[], int n)
{
HashMap<Integer,
Integer> mp = new HashMap<Integer,
Integer>();
mp.put( 0 , 1 );
int answer = 0 ;
int preXor = 0 ;
for ( int i = 0 ; i < n; i++)
{
int value = 1 ;
preXor ^= array[i];
for ( int j = 1 ; j <= MAX; j++)
{
int Y = value ^ preXor;
if (mp.containsKey(Y))
{
answer += mp.get(Y);
}
value *= 2 ;
}
if (mp.containsKey(preXor))
{
mp.put(preXor,mp.get(preXor) + 1 );
}
else
{
mp.put(preXor, 1 );
}
}
return answer;
}
public static void main (String[] args)
{
int array[] = { 2 , 6 , 7 , 5 , 8 };
int n = array.length;
System.out.println(findSubarray(array, n));
}
}
|
Python3
MAX = 10
def findSubarray(array, n):
mp = dict ()
mp[ 0 ] = 1
answer = 0
preXor = 0
for i in range (n):
value = 1
preXor ^ = array[i]
for j in range ( 1 , MAX + 1 ):
Y = value ^ preXor
if ( Y in mp.keys()):
answer + = mp[Y]
value * = 2
if (preXor in mp.keys()):
mp[preXor] + = 1
else :
mp[preXor] = 1
return answer
array = [ 2 , 6 , 7 , 5 , 8 ]
n = len (array)
print (findSubarray(array, n))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int MAX = 10;
static int findSubarray( int []array, int n)
{
Dictionary< int ,
int > mp = new Dictionary< int ,
int >();
mp.Add(0, 1);
int answer = 0;
int preXor = 0;
for ( int i = 0; i < n; i++)
{
int value = 1;
preXor ^= array[i];
for ( int j = 1; j <= MAX; j++)
{
int Y = value ^ preXor;
if (mp.ContainsKey(Y))
{
answer += mp[Y];
}
value *= 2;
}
if (mp.ContainsKey(preXor))
{
mp[preXor] = mp[preXor] + 1;
}
else
{
mp.Add(preXor, 1);
}
}
return answer;
}
public static void Main (String[] args)
{
int []array = { 2, 6, 7, 5, 8 };
int n = array.Length;
Console.WriteLine(findSubarray(array, n));
}
}
|
Javascript
<script>
var MAX = 10;
function findSubarray(array, n)
{
var mp = new Map();
mp.set(0,1);
var answer = 0;
var preXor = 0;
for ( var i = 0; i < n; i++) {
var value = 1;
preXor ^= array[i];
for ( var j = 1; j <= MAX; j++) {
var Y = value ^ preXor;
if (mp.has(Y)) {
answer += mp.get(Y);
}
value *= 2;
}
if (mp.has(preXor)) {
mp.set(preXor, mp.get(preXor)+1);
}
else {
mp.set(preXor,1);
}
}
return answer;
}
var array = [2, 6, 7, 5, 8 ];
var n = array.length;
document.write( findSubarray(array, n));
</script>
|
Time Complexity: O(n * MAX)
Auxiliary Space: O(n)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...