Sum of XOR of all sub-arrays of length K

Given an array of length n ( n > k), we have to find the sum of xor of all the elements of the sub-arrays which are of length k.

Examples:

Input : arr[]={1, 2, 3, 4}, k=2
Output :Sum= 11
Sum = 1^2 + 2^3 + 3^4 = 3 + 1 + 7 =11



Input :arr[]={1, 2, 3, 4}, k=3
Output :Sum= 5
Sum = 1^2^3 + 2^3^4 = 0 + 5 =5

Naive Solution: The idea is to traverse all the subarrays of length k and find the xor of all the elements of the subarray and sum them up to find the sum of XOR of all K length sub-array of an array.
Time Complexity : O(N2)

Efficient Solution: The efficient solution is to traverse the array and find all the subarray of length k, i.e. ( 0 to k-1), (1 to k), (2 to k+1), …., (n-k+1 to n).

We will find and store the xor of elements from 0 to i (in an array x[]) by forming a pre-xor array.

Now, xor of sub array from l to r is equal to x[l-1] ^ x[r] because x[r] will give the xor of all elements till r and x[l-1] will give the xor of all elements till l-1. When we will take xor of these two values the elements till 0 to l-1 will be repeated. As a^a = 0, the repeated values would contribute zero to the net value and we get the value of xor sub array from l to r.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of above approach
#include <iostream>
using namespace std;
  
// Sum of XOR of all K length
// sub-array of an array
int FindXorSum(int arr[], int k, int n)
{
    // If the length of the array is less than k
    if (n < k)
        return 0;
  
    // Array that will store xor values of
    // subarray from 1 to i
    int x[n] = { 0 };
    int result = 0;
  
    // Traverse through the array
    for (int i = 0; i < n; i++) {
  
        // If i is greater than zero, store
        // xor of all the elements from 0 to i
        if (i > 0)
            x[i] = x[i - 1] ^ arr[i];
  
        // If it is the first element
        else
            x[i] = arr[i];
  
        // If i is greater than k
        if (i >= k - 1) {
            int sum = 0;
  
            // Xor of values from 0 to i
            sum = x[i];
  
            // Now to find subarray of length k
            // that ends at i, xor sum with x[i-k]
            if (i - k > -1)
                sum ^= x[i - k];
  
            // Add the xor of elements from i-k+1 to i
            result += sum;
        }
    }
  
    // Return the resultant sum;
    return result;
}
  
// Driver code
int main()
{
    int arr[] = { 1, 2, 3, 4 };
  
    int n = 4, k = 2;
  
    cout << FindXorSum(arr, k, n) << endl;
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
class GFG 
{
  
// Sum of XOR of all K length
// sub-array of an array
static int FindXorSum(int arr[], int k, int n)
{
    // If the length of the array is less than k
    if (n < k)
        return 0;
  
    // Array that will store xor values of
    // subarray from 1 to i
    int []x = new int[n];
    int result = 0;
  
    // Traverse through the array
    for (int i = 0; i < n; i++) 
    {
  
        // If i is greater than zero, store
        // xor of all the elements from 0 to i
        if (i > 0)
            x[i] = x[i - 1] ^ arr[i];
  
        // If it is the first element
        else
            x[i] = arr[i];
  
        // If i is greater than k
        if (i >= k - 1)
        {
            int sum = 0;
  
            // Xor of values from 0 to i
            sum = x[i];
  
            // Now to find subarray of length k
            // that ends at i, xor sum with x[i-k]
            if (i - k > -1)
                sum ^= x[i - k];
  
            // Add the xor of elements from i-k+1 to i
            result += sum;
        }
    }
  
    // Return the resultant sum;
    return result;
}
  
// Driver code
public static void main(String[] args) 
{
    int arr[] = { 1, 2, 3, 4 };
  
    int n = 4, k = 2;
  
    System.out.println(FindXorSum(arr, k, n));
}
}
  
// This code contributed by Rajput-Ji

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python implementation of above approach 
  
# Sum of XOR of all K length 
# sub-array of an array 
def FindXorSum(arr, k, n): 
      
    # If the length of the array is less than k 
    if (n < k): 
        return 0
  
    # Array that will store xor values of 
    # subarray from 1 to i 
    x = [0]*n; 
    result = 0
  
    # Traverse through the array 
    for i in range(n):
  
        # If i is greater than zero, store 
        # xor of all the elements from 0 to i 
        if (i > 0): 
            x[i] = x[i - 1] ^ arr[i]; 
  
        # If it is the first element 
        else:
            x[i] = arr[i]; 
  
        # If i is greater than k 
        if (i >= k - 1):
            sum = 0
  
            # Xor of values from 0 to i 
            sum = x[i]; 
  
            # Now to find subarray of length k 
            # that ends at i, xor sum with x[i-k] 
            if (i - k > -1): 
                sum ^= x[i - k]; 
  
            # Add the xor of elements from i-k+1 to i 
            result += sum
  
    # Return the resultant sum; 
    return result; 
  
# Driver code
arr = [ 1, 2, 3, 4 ]; 
  
n = 4; k = 2
  
print(FindXorSum(arr, k, n)); 
  
# This code has been contributed by 29AjayKumar

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the above approach 
using System;
  
class GFG 
      
    // Sum of XOR of all K length 
    // sub-array of an array 
    static int FindXorSum(int []arr, int k, int n) 
    
        // If the length of the array is less than k 
        if (n < k) 
            return 0; 
      
        // Array that will store xor values of 
        // subarray from 1 to i 
        int []x = new int[n]; 
        int result = 0; 
      
        // Traverse through the array 
        for (int i = 0; i < n; i++) 
        
      
            // If i is greater than zero, store 
            // xor of all the elements from 0 to i 
            if (i > 0) 
                x[i] = x[i - 1] ^ arr[i]; 
      
            // If it is the first element 
            else
                x[i] = arr[i]; 
      
            // If i is greater than k 
            if (i >= k - 1) 
            
                int sum = 0; 
      
                // Xor of values from 0 to i 
                sum = x[i]; 
      
                // Now to find subarray of length k 
                // that ends at i, xor sum with x[i-k] 
                if (i - k > -1) 
                    sum ^= x[i - k]; 
      
                // Add the xor of elements from i-k+1 to i 
                result += sum; 
            
        
      
        // Return the resultant sum; 
        return result; 
    
  
    // Driver code 
    public static void Main() 
    
        int []arr = { 1, 2, 3, 4 }; 
      
        int n = 4, k = 2; 
      
        Console.WriteLine(FindXorSum(arr, k, n)); 
    
  
// This code is contributed by AnkitRai01 

chevron_right


Output:

11

Time Complexity : O(N)



My Personal Notes arrow_drop_up

Second year Department of Information Technology Jadavpur University

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.