Find element which maximize the XOR value for N given update query
Last Updated :
18 Feb, 2023
Given arrays Arr[] and Queries[] of size N and an integer K such that (0 ≤ Arr[i], Queries[i] < 2K), the task is to form an array, where each element represents an integer such that XOR of all elements of array and element is maximum by updating Arr[i] with Queries[i] at each step (0 ≤ i ≤ N-1).
Examples:
Input: N = 4, Arr[] = {2, 3, 4, 7}, Queries[] = {1, 0, 3, 4}, K = 4
Output: {14, 13, 10, 9}
Explanation: The queries are answered as follows:
- 1st query: Arr[] = {2, 3, 4, 7}, After Updating Arr[] = {1, 3, 4, 7} then Choosing X = 14 since 1 XOR 3 XOR 4 XOR 7 XOR 14 = 15 which is the maximum.
- 2nd query: Arr[] = {1, 3, 4, 7}, After Updating Arr[] = {1, 0, 4, 7} then Choosing X = 13 since 1 XOR 0 XOR 4 XOR 7 XOR 13 = 15 which is the maximum.
- 3rd query: Arr[] = {1, 0, 4, 7}, After Updating Arr[[ = {1, 0, 3, 7} then Choosing X = 10 since 1 XOR 0 XOR 3 XOR 7 XOR 10 = 15 which is the maximum.
- 1st query: Arr[] = {1, 0, 3, 7}, After Updating Arr[] = {1, 0, 3, 4 ] then Choosing X = 9 since 1 XOR 0 XOR 3 XOR 4 XOR 9 = 15 which is the maximum.
Input: N = 3, Arr[] = {0, 1, 3}, Queries[] = {2, 2, 2}, K = 3
Output: {7, 4, 5}
Explanation: The queries are answered as follows :
- 1st query: Arr[] = {0, 1, 3}, After Updating Arr[] = {2, 1, 3} then Choosing X = 7 since 2 XOR 1 XOR 3 XOR 7 = 7 which is the maximum .
- 2nd query: Arr[] = {2, 1, 3}, After Updating Arr[] = {2, 2, 3} then Choosing X = 4 since 2 XOR 2 XOR 3 XOR 4 = 7 which is the maximum .
- 3rd query: Arr[] = {2, 2, 3}, After Updating Arr[] = {2, 2, 2} then Choosing X = 5 since 2 XOR 2 XOR 2 XOR 5 = 7 which is the maximum.
Approach: This problem can be solved with the following idea:
Calculate xor of the array Arr[] and let it be Q, We know the xor property that a xor b = c then a xor c = b or b xor c = a . We need xor to be maximum for every query so rhs will always be (2K – 1) then the equation becomes Q ^ X = (2K – 1) or X = Q ^ (2K – 1) .
Follow the steps to implement the idea:
- Declare a vector Answer.
- Initialize preXor with 0.
- Run a for loop from i : 0 to N and compute the Xor of the array and store it in preXor.
- Initialize rhs with (1 << K) – 1.
- Run a loop from i : 0 to N and perform the following steps:
- update preXor = ( preXor ^ Arr[i] )
- update preXor = ( preXor ^ Queries[i] ) .
- Store ( rhs ^ preXor ) in the Answer array.
Below is the implementation of the above algorithm :
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > MaxXor( int N, vector< int >& Arr,
vector< int >& Queries, int K)
{
vector< int > answer;
int preXor = 0;
for ( int i = 0; i < N; i++) {
preXor = (preXor ^ Arr[i]);
}
int rhs = (1 << K) - 1;
for ( int i = 0; i < N; i++) {
preXor = (preXor ^ Arr[i]);
preXor = (preXor ^ Queries[i]);
answer.push_back(rhs ^ preXor);
}
return answer;
}
void print( int N, vector< int >& answer)
{
for ( int i = 0; i < N; i++) {
cout << answer[i] << " " ;
}
}
int main()
{
int N = 4;
vector< int > Arr = { 2, 3, 4, 7 };
vector< int > Queries = { 1, 0, 3, 4 };
int K = 4;
vector< int > answer = MaxXor(N, Arr, Queries, K);
print(N, answer);
return 0;
}
|
Java
import java.util.*;
public class Main {
public static List<Integer> MaxXor( int N, List<Integer> Arr,
List<Integer> Queries, int K) {
List<Integer> answer = new ArrayList<>();
int preXor = 0 ;
for ( int i = 0 ; i < N; i++) {
preXor = (preXor ^ Arr.get(i));
}
int rhs = ( 1 << K) - 1 ;
for ( int i = 0 ; i < N; i++) {
preXor = (preXor ^ Arr.get(i));
preXor = (preXor ^ Queries.get(i));
answer.add(rhs ^ preXor);
}
return answer;
}
public static void print( int N, List<Integer> answer) {
for ( int i = 0 ; i < N; i++) {
System.out.print(answer.get(i) + " " );
}
}
public static void main(String[] args) {
int N = 4 ;
List<Integer> Arr = Arrays.asList( 2 , 3 , 4 , 7 );
List<Integer> Queries = Arrays.asList( 1 , 0 , 3 , 4 );
int K = 4 ;
List<Integer> answer = MaxXor(N, Arr, Queries, K);
print(N, answer);
}
}
|
Python3
from typing import List
def MaxXor(N: int , Arr: List [ int ], Queries: List [ int ], K: int ) - > List [ int ]:
answer = []
preXor = 0
for i in range (N):
preXor = (preXor ^ Arr[i])
rhs = ( 1 << K) - 1
for i in range (N):
preXor = (preXor ^ Arr[i])
preXor = (preXor ^ Queries[i])
answer.append(rhs ^ preXor)
return answer
def print_ans(N: int , answer: List [ int ]):
for i in range (N):
print (answer[i], end = " " )
print ()
if __name__ = = "__main__" :
N = 4
Arr = [ 2 , 3 , 4 , 7 ]
Queries = [ 1 , 0 , 3 , 4 ]
K = 4
answer = MaxXor(N, Arr, Queries, K)
print_ans(N, answer)
|
C#
using System;
using System.Linq;
using System.Collections.Generic;
class GFG
{
static List< int > MaxXor( int N, List< int > Arr, List< int > Queries, int K)
{
List< int > answer= new List< int >();
int preXor = 0;
for ( int i = 0; i < N; i++) {
preXor = (preXor ^ Arr[i]);
}
int rhs = (1 << K) - 1;
for ( int i = 0; i < N; i++) {
preXor = (preXor ^ Arr[i]);
preXor = (preXor ^ Queries[i]);
answer.Add(rhs ^ preXor);
}
return answer;
}
static void print( int N, List< int > answer)
{
for ( int i = 0; i < N; i++) {
Console.Write(answer[i] + " " );
}
}
static public void Main()
{
int N = 4;
List< int > Arr = new List< int >{ 2, 3, 4, 7 };
List< int > Queries = new List< int >{ 1, 0, 3, 4 };
int K = 4;
List< int > answer = MaxXor(N, Arr, Queries, K);
print(N, answer);
}
}
|
Javascript
function MaxXor(N, Arr, Queries, K)
{
let answer=[];
let preXor = 0;
for (let i = 0; i < N; i++) {
preXor = (preXor ^ Arr[i]);
}
let rhs = (1 << K) - 1;
for (let i = 0; i < N; i++) {
preXor = (preXor ^ Arr[i]);
preXor = (preXor ^ Queries[i]);
answer.push(rhs ^ preXor);
}
return answer;
}
function print(N, answer)
{
for (let i = 0; i < N; i++) {
console.log(answer[i] + " " );
}
}
let N = 4;
let Arr = [ 2, 3, 4, 7 ];
let Queries = [ 1, 0, 3, 4 ];
let K = 4;
let answer = MaxXor(N, Arr, Queries, K);
print(N, answer);
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Related Articles:
Share your thoughts in the comments
Please Login to comment...