📜  查找XOR值为2的幂的子数组的数量

📅  最后修改于: 2021-05-04 20:44:54             🧑  作者: Mango

给定一个整数数组,arr []的大小为N。arr []的任何子数组的XOR值定义为该子数组中所有整数的异或。任务是找到XOR值为2的幂的子数组的数量。(1、2、4、8、16,…。)

例子:

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 

方法

  1. 维护一个哈希图,该哈希图存储所有前缀XOR值及其计数。
  2. 在任何索引i处,我们都需要找到在i处结束并具有XOR值2的幂的子数组的数量。对于所有2的幂,我们需要找到可能的子数组的数量。例如。 :假设直到索引i为X的当前XOR值,我们需要找到结果为16的子数组的数量(例如S),因此我们需要对前缀XOR Y进行计数,以使(X ^ Y)= S或Y = S ^ X。可以使用哈希图找到Y。
  3. 对所有索引执行步骤2,添加输出。

下面是上述方法的实现:

C++
// C++ Program to count number of subarrays 
// with Bitwise-XOR as power of 2
  
#include 
#define ll long long int
#define MAX 10
using namespace std;
  
// Function to find number of subarrays
int findSubarray(int array[], int n)
{
    // Hash Map to store prefix XOR values
    unordered_map 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 Code
int 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 2
import java.util.*;
  
class GFG
{
  
static int MAX = 10;
  
// Function to find number of subarrays
static int findSubarray(int array[], int n)
{
    // Hash Map to store prefix XOR values
    HashMap mp = new HashMap();
  
    // 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 Code
public 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 2
MAX = 10
  
# Function to find number of subarrays
def 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 Code
array = [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 2
using System;
using System.Collections.Generic;
  
class GFG
{
static int MAX = 10;
  
// Function to find number of subarrays
static int findSubarray(int []array, int n)
{
    // Hash Map to store prefix XOR values
    Dictionary mp = new Dictionary();
  
    // 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 Code
public 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


输出:
6