XOR of a subarray (range of elements) | Set 2
Last Updated :
13 Jul, 2021
Given an array integer arr[] of size N and Q queries. Each query is of the form (L, R), where L and R are indices of the array. The task is to find the XOR value of the subarray arr[L…R].
Examples:
Input: arr[] = {2, 5, 1, 6, 1, 2, 5} query[] = {{1, 4}}
Output: 3
The XOR value of arr[1…4] is 3.
Input: arr[] = {2, 5, 1, 6, 1, 2, 5} query[] = {{0, 6}}
Output: 6
The XOR value of arr[0…6] is 6.
O(N) auxiliary space approach: Please refer to this article for the O(N) auxiliary space approach.
Approach: Here we will discuss a constant space solution, but we will modify the input array.
1. Update the input array from index 1 to N – 1, such that arr[i] stores the XOR from arr[0] to arr[i].
arr[i] = XOR(arr[0], arr[1], .., arr[i])
2. To process a query from L to R just return arr[L-1] ^ arr[R].
For example:
Consider the example: arr[] = { 3, 2, 4, 5, 1, 1, 5, 3 }, query[] = {{1, 4 }, { 3, 7}}
After taking the XOR of consecutive elements, arr[] = {3, 1, 5, 0, 1, 0, 5, 6}
For first query {1, 4} ans = arr[0] ^ arr[4] = 3 ^ 1 = 2
For the second query {3, 7} ans = arr[2] ^ arr[7] = 5 ^ 6 = 3
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void find_Xor( int arr[],
pair< int , int > query[],
int N, int Q)
{
for ( int i = 1; i < N; i++) {
arr[i] = arr[i] ^ arr[i - 1];
}
int ans = 0;
for ( int i = 0; i < Q; i++) {
if (query[i].first == 0)
ans = arr[query[i].second];
else
ans = arr[query[i].first - 1]
^ arr[query[i].second];
cout << ans << endl;
}
}
int main()
{
int arr[] = { 3, 2, 4, 5,
1, 1, 5, 3 };
int N = 8;
int Q = 2;
pair< int , int > query[Q]
= { { 1, 4 },
{ 3, 7 } };
find_Xor(arr, query, N, Q);
return 0;
}
|
Java
class GFG{
static class pair
{
int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
static void find_Xor( int arr[],
pair query[],
int N, int Q)
{
for ( int i = 1 ; i < N; i++)
{
arr[i] = arr[i] ^ arr[i - 1 ];
}
int ans = 0 ;
for ( int i = 0 ; i < Q; i++)
{
if (query[i].first == 0 )
ans = arr[query[i].second];
else
ans = arr[query[i].first - 1 ] ^
arr[query[i].second];
System.out.print(ans + "\n" );
}
}
public static void main(String[] args)
{
int arr[] = { 3 , 2 , 4 , 5 ,
1 , 1 , 5 , 3 };
int N = 8 ;
int Q = 2 ;
pair query[] = { new pair( 1 , 4 ),
new pair( 3 , 7 ) };
find_Xor(arr, query, N, Q);
}
}
|
Python3
def find_Xor(arr, query, N, Q):
for i in range ( 1 , N):
arr[i] = arr[i] ^ arr[i - 1 ]
ans = 0
for i in range (Q):
if query[i][ 0 ] = = 0 :
ans = arr[query[i][ 1 ]]
else :
ans = (arr[query[i][ 0 ] - 1 ] ^
arr[query[i][ 1 ]])
print (ans)
def main():
arr = [ 3 , 2 , 4 , 5 , 1 , 1 , 5 , 3 ]
N = 8
Q = 2
query = [ [ 1 , 4 ],
[ 3 , 7 ] ]
find_Xor(arr, query, N, Q)
main()
|
C#
using System;
class GFG{
class pair
{
public int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
static void find_Xor( int []arr,
pair []query,
int N, int Q)
{
for ( int i = 1; i < N; i++)
{
arr[i] = arr[i] ^ arr[i - 1];
}
int ans = 0;
for ( int i = 0; i < Q; i++)
{
if (query[i].first == 0)
ans = arr[query[i].second];
else
ans = arr[query[i].first - 1] ^
arr[query[i].second];
Console.Write(ans + "\n" );
}
}
public static void Main(String[] args)
{
int []arr = { 3, 2, 4, 5,
1, 1, 5, 3 };
int N = 8;
int Q = 2;
pair []query = { new pair(1, 4),
new pair(3, 7) };
find_Xor(arr, query, N, Q);
}
}
|
Javascript
<script>
function find_Xor(arr, query, N, Q)
{
for ( var i = 1; i < N; i++) {
arr[i] = arr[i] ^ arr[i - 1];
}
var ans = 0;
for ( var i = 0; i < Q; i++) {
if (query[i][0] == 0)
ans = arr[query[i][1]];
else
ans = arr[query[i][0] - 1]
^ arr[query[i][1]];
document.write( ans + "<br>" );
}
}
var arr = [3, 2, 4, 5,
1, 1, 5, 3];
var N = 8;
var Q = 2;
var query
= [[1, 4],
[3, 7]];
find_Xor(arr, query, N, Q);
</script>
|
Time Complexity: O (N + Q)
Auxiliary Space: O (1)
Share your thoughts in the comments
Please Login to comment...