Given an array a of size N. The task is to find an index ‘i’ (1 <= i <= N) such that (a[1] ^ … ^ a[i]) + (a[i+1] ^ … ^ a[N]) (x^y represents the xor value of x and y) is maximum possible.
Examples:
Input : arr[] = {1, 4, 6, 3, 8, 13, 34, 2, 21, 10}
Output : 2
Explanation : The maximum value is 68 at index 2
Input : arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}
Output : 4
Naive Approach: A naive approach is to use nested loops. Traverse the array and find the xor of the array till the i’th index and find the xor of elements from index i+1 to and calculate the maximum sum possible.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int Xor_Sum( int arr[], int n)
{
int sum = 0, index, left_xor = 0, right_xor = 0;
for ( int i = 0; i < n; i++)
{
left_xor = left_xor ^ arr[i];
right_xor = 0;
for ( int j = i + 1; j < n; j++)
{
right_xor = right_xor ^ arr[j];
}
if (left_xor + right_xor > sum)
{
sum = left_xor + right_xor;
index = i;
}
}
return index+1;
}
int main()
{
int arr[] = { 1, 4, 6, 3, 8, 13, 34, 2, 21, 10 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << Xor_Sum(arr, n);
return 0;
}
|
Java
class GFG
{
public static int Xor_Sum( int [] arr, int n)
{
int sum = 0 , index = - 1 ;
int left_xor = 0 , right_xor = 0 ;
for ( int i = 0 ; i < n; i++)
{
left_xor = left_xor ^ arr[i];
right_xor = 0 ;
for ( int j = i + 1 ; j < n; j++)
{
right_xor = right_xor ^ arr[j];
}
if (left_xor + right_xor > sum)
{
sum = left_xor + right_xor;
index = i;
}
}
return index + 1 ;
}
public static void main(String[] args)
{
int [] arr = { 1 , 4 , 6 , 3 , 8 ,
13 , 34 , 2 , 21 , 10 };
int n = arr.length;
System.out.println(Xor_Sum(arr, n));
}
}
|
Python3
def Xor_Sum(arr, n):
sum = 0
index, left_xor = 0 , 0
right_xor = 0
for i in range (n):
left_xor = left_xor ^ arr[i]
right_xor = 0
for j in range (i + 1 , n):
right_xor = right_xor ^ arr[j]
if (left_xor + right_xor > sum ):
sum = left_xor + right_xor
index = i
return index + 1
arr = [ 1 , 4 , 6 , 3 , 8 ,
13 , 34 , 2 , 21 , 10 ]
n = len (arr)
print (Xor_Sum(arr, n))
|
C#
using System;
class GFG
{
public static int Xor_Sum( int [] arr,
int n)
{
int sum = 0, index = -1;
int left_xor = 0, right_xor = 0;
for ( int i = 0; i < n; i++)
{
left_xor = left_xor ^ arr[i];
right_xor = 0;
for ( int j = i + 1; j < n; j++)
{
right_xor = right_xor ^ arr[j];
}
if (left_xor + right_xor > sum)
{
sum = left_xor + right_xor;
index = i;
}
}
return index + 1;
}
public static void Main(String[] args)
{
int [] arr = { 1, 4, 6, 3, 8,
13, 34, 2, 21, 10 };
int n = arr.Length;
Console.WriteLine (Xor_Sum(arr, n));
}
}
|
Javascript
<script>
function Xor_Sum(arr, n)
{
let sum = 0, index, left_xor = 0,
right_xor = 0;
for (let i = 0; i < n; i++)
{
left_xor = left_xor ^ arr[i];
right_xor = 0;
for (let j = i + 1; j < n; j++)
{
right_xor = right_xor ^ arr[j];
}
if (left_xor + right_xor > sum)
{
sum = left_xor + right_xor;
index = i;
}
}
return index+1;
}
let arr = [ 1, 4, 6, 3, 8, 13, 34, 2, 21, 10 ];
let n = arr.length;
document.write(Xor_Sum(arr, n));
</script>
|
Time complexity: O( N^2 )
Auxiliary space: O(1)
Efficient Approach: An efficient approach is to use a prefix xor array. At any index ‘i’ PrefixXor[i] gives us arr[1] ^ arr[1] ^….^ arr[i] and to get arr[i+1] ^ arr[i+2] ^ . . ^ arr[n-1], find PrefixXor[i] ^ PrefixXor[n] .
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void ComputePrefixXor( int arr[], int PrefixXor[], int n)
{
PrefixXor[0] = arr[0];
for ( int i = 1; i < n; i++)
PrefixXor[i] = PrefixXor[i - 1] ^ arr[i];
}
int Xor_Sum( int arr[], int n)
{
int PrefixXor[n];
ComputePrefixXor(arr, PrefixXor, n);
int sum = 0, index;
for ( int i = 0; i < n; i++)
{
if (PrefixXor[i] + (PrefixXor[n - 1] ^
PrefixXor[i]) > sum)
{
sum = PrefixXor[i] +
(PrefixXor[n - 1] ^ PrefixXor[i]);
index = i;
}
}
return index+1;
}
int main()
{
int arr[] = { 1, 4, 6, 3, 8, 13, 34, 2, 21, 10 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << Xor_Sum(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void ComputePrefixXor( int arr[],
int PrefixXor[],
int n)
{
PrefixXor[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
PrefixXor[i] = PrefixXor[i - 1 ] ^ arr[i];
}
static int Xor_Sum( int arr[], int n)
{
int []PrefixXor = new int [n];
ComputePrefixXor(arr, PrefixXor, n);
int sum = 0 , index = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (PrefixXor[i] + (PrefixXor[n - 1 ] ^
PrefixXor[i]) > sum)
{
sum = PrefixXor[i] +
(PrefixXor[n - 1 ] ^ PrefixXor[i]);
index = i;
}
}
return index+ 1 ;
}
public static void main(String[] args)
{
int arr[] = { 1 , 4 , 6 , 3 , 8 ,
13 , 34 , 2 , 21 , 10 };
int n = arr.length;
System.out.println(Xor_Sum(arr, n));
}
}
|
Python3
def ComputePrefixXor(arr, PrefixXor, n):
PrefixXor[ 0 ] = arr[ 0 ];
for i in range ( 1 , n):
PrefixXor[i] = PrefixXor[i - 1 ] ^ arr[i];
def Xor_Sum(arr, n):
PrefixXor = [ 0 ] * n;
ComputePrefixXor(arr, PrefixXor, n);
sum , index = 0 , 0 ;
for i in range (n):
if (PrefixXor[i] + (PrefixXor[n - 1 ] ^
PrefixXor[i]) > sum ):
sum = PrefixXor[i] + \
(PrefixXor[n - 1 ] ^ PrefixXor[i]);
index = i;
return index + 1 ;
arr = [ 1 , 4 , 6 , 3 , 8 , 13 , 34 , 2 , 21 , 10 ];
n = len (arr);
print (Xor_Sum(arr, n));
|
C#
using System;
class GFG
{
static void ComputePrefixXor( int [] arr,
int [] PrefixXor,
int n)
{
PrefixXor[0] = arr[0];
for ( int i = 1; i < n; i++)
PrefixXor[i] = PrefixXor[i - 1] ^ arr[i];
}
static int Xor_Sum( int [] arr, int n)
{
int []PrefixXor = new int [n];
ComputePrefixXor(arr, PrefixXor, n);
int sum = 0, index = 0;
for ( int i = 0; i < n; i++)
{
if (PrefixXor[i] + (PrefixXor[n - 1] ^
PrefixXor[i]) > sum)
{
sum = PrefixXor[i] + (PrefixXor[n - 1] ^
PrefixXor[i]);
index = i;
}
}
return index + 1;
}
public static void Main()
{
int [] arr = { 1, 4, 6, 3, 8,
13, 34, 2, 21, 10 };
int n = arr.Length;
Console.WriteLine(Xor_Sum(arr, n));
}
}
|
Javascript
<script>
function ComputePrefixXor(arr, PrefixXor, n)
{
PrefixXor[0] = arr[0];
for (let i = 1; i < n; i++)
PrefixXor[i] = PrefixXor[i - 1] ^ arr[i];
}
function Xor_Sum(arr, n)
{
let PrefixXor = new Array(n);
ComputePrefixXor(arr, PrefixXor, n);
let sum = 0, index;
for (let i = 0; i < n; i++)
{
if (PrefixXor[i] + (PrefixXor[n - 1] ^
PrefixXor[i]) > sum)
{
sum = PrefixXor[i] +
(PrefixXor[n - 1] ^ PrefixXor[i]);
index = i;
}
}
return index+1;
}
let arr = [ 1, 4, 6, 3, 8, 13, 34, 2, 21, 10 ];
let n = arr.length;
document.write(Xor_Sum(arr, n));
</script>
|
Time complexity: O(N) where N is the size of the given array
Auxiliary space: O(N)