Alternate XOR operations on sorted array
Last Updated :
18 Nov, 2021
Given an array arr[] and two integers X and K. The task is to perform the following operation on array K times:
- Sort the array.
- XOR every alternate element of the sorted array with X i.e. arr[0], arr[2], arr[4], …
After repeating the above steps K times, print the maximum and the minimum element in the modified array.
Examples:
Input: arr[] = {9, 7, 11, 15, 5}, K = 1, X = 2
Output: 7 13
Since the operations has to be performed only once,
the sorted array will be {5, 7, 9, 11, 15}
Now, apply xor with 2 on alternate elements i.e. 5, 9 and 15.
{5 ^ 2, 7, 9 ^ 2, 11, 15 ^ 2} which is equal to
{7, 7, 11, 11, 13}
Input: arr[] = {605, 986}, K = 548, X = 569
Output: 605 986
Approach: Instead of sorting the array in every iteration, a frequency array can be maintained that will store the frequency of each element in the array. Traversing from 1 to maximum element in the array, the elements can be processed in the sorted order and after every operation, the frequency of the same elements can be adjusted when the alternate elements get XORed with the given integer. Check the programming implementation for more details.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX 100000
void xorOnSortedArray( int arr[], int n, int k, int x)
{
int arr1[MAX + 1] = { 0 };
int arr2[MAX + 1] = { 0 };
int xor_val[MAX + 1];
for ( int i = 0; i < n; i++)
arr1[arr[i]]++;
for ( int i = 0; i <= MAX; i++)
xor_val[i] = i ^ x;
while (k--) {
int count = 0;
for ( int i = 0; i <= MAX; i++) {
int store = arr1[i];
if (arr1[i] > 0) {
if (count % 2 == 0) {
int div = ceil (( float )arr1[i] / 2);
arr1[i] = arr1[i] - div ;
arr2[xor_val[i]] += div ;
}
else if (count % 2 != 0) {
int div = arr1[i] / 2;
arr1[i] = arr1[i] - div ;
arr2[xor_val[i]] += div ;
}
}
count = count + store;
}
for ( int i = 0; i <= MAX; i++) {
arr1[i] = arr1[i] + arr2[i];
arr2[i] = 0;
}
}
int min = INT_MAX;
int max = INT_MIN;
for ( int i = 0; i <= MAX; i++) {
if (arr1[i] > 0) {
if (min > i)
min = i;
if (max < i)
max = i;
}
}
cout << min << " " << max << endl;
}
int main()
{
int arr[] = { 605, 986 };
int n = sizeof (arr) / sizeof (arr[0]);
int k = 548, x = 569;
xorOnSortedArray(arr, n, k, x);
return 0;
}
|
Java
class GFG
{
static int MAX = 100000 ;
public static void xorOnSortedArray( int [] arr, int n,
int k, int x)
{
int [] arr1 = new int [MAX + 1 ];
int [] arr2 = new int [MAX + 1 ];
int [] xor_val = new int [MAX + 1 ];
for ( int i = 0 ; i < n; i++)
arr1[arr[i]]++;
for ( int i = 0 ; i <= MAX; i++)
xor_val[i] = i ^ x;
while (k-- > 0 )
{
int count = 0 ;
for ( int i = 0 ; i <= MAX; i++)
{
int store = arr1[i];
if (arr1[i] > 0 )
{
if (count % 2 == 0 )
{
int div = ( int ) Math.ceil(arr1[i] / 2 );
arr1[i] = arr1[i] - div;
arr2[xor_val[i]] += div;
}
else if (count % 2 != 0 )
{
int div = arr1[i] / 2 ;
arr1[i] = arr1[i] - div;
arr2[xor_val[i]] += div;
}
}
count = count + store;
}
for ( int i = 0 ; i <= MAX; i++)
{
arr1[i] = arr1[i] + arr2[i];
arr2[i] = 0 ;
}
}
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for ( int i = 0 ; i <= MAX; i++)
{
if (arr1[i] > 0 )
{
if (min > i)
min = i;
if (max < i)
max = i;
}
}
System.out.println(min + " " + max);
}
public static void main(String[] args)
{
int [] arr = { 605 , 986 };
int n = arr.length;
int k = 548 , x = 569 ;
xorOnSortedArray(arr, n, k, x);
}
}
|
Python 3
MAX = 10000
import sys
from math import ceil, floor
def xorOnSortedArray(arr, n, k, x):
arr1 = [ 0 for i in range ( MAX + 1 )]
arr2 = [ 0 for i in range ( MAX + 1 )]
xor_val = [ 0 for i in range ( MAX + 1 )]
for i in range (n):
arr1[arr[i]] + = 1
for i in range ( MAX + 1 ):
xor_val[i] = i ^ x
while (k > 0 ):
k - = 1
count = 0
for i in range ( MAX + 1 ):
store = arr1[i]
if (arr1[i] > 0 ):
if (count % 2 = = 0 ):
div = arr1[i] / / 2 + 1
arr1[i] = arr1[i] - div
arr2[xor_val[i]] + = div
elif (count % 2 ! = 0 ):
div = arr1[i] / / 2
arr1[i] = arr1[i] - div
arr2[xor_val[i]] + = div
count = count + store
for i in range ( MAX + 1 ):
arr1[i] = arr1[i] + arr2[i]
arr2[i] = 0
mn = sys.maxsize
mx = - sys.maxsize - 1
for i in range ( MAX + 1 ):
if (arr1[i] > 0 ):
if (mn > i):
mn = i
if (mx < i):
mx = i
print (mn,mx)
if __name__ = = '__main__' :
arr = [ 605 , 986 ]
n = len (arr)
k = 548
x = 569
xorOnSortedArray(arr, n, k, x)
|
C#
using System;
class GFG
{
static int MAX = 100000;
public static void xorOnSortedArray( int [] arr, int n,
int k, int x)
{
int [] arr1 = new int [MAX + 1];
int [] arr2 = new int [MAX + 1];
int [] xor_val = new int [MAX + 1];
for ( int i = 0; i < n; i++)
arr1[arr[i]]++;
for ( int i = 0; i <= MAX; i++)
xor_val[i] = i ^ x;
while (k-- > 0)
{
int count = 0;
for ( int i = 0; i <= MAX; i++)
{
int store = arr1[i];
if (arr1[i] > 0)
{
if (count % 2 == 0)
{
int div = ( int ) Math.Ceiling(( double )(arr1[i] / 2));
arr1[i] = arr1[i] - div;
arr2[xor_val[i]] += div;
}
else if (count % 2 != 0)
{
int div = arr1[i] / 2;
arr1[i] = arr1[i] - div;
arr2[xor_val[i]] += div;
}
}
count = count + store;
}
for ( int i = 0; i <= MAX; i++)
{
arr1[i] = arr1[i] + arr2[i];
arr2[i] = 0;
}
}
int min = int .MaxValue;
int max = int .MinValue;
for ( int i = 0; i <= MAX; i++)
{
if (arr1[i] > 0)
{
if (min > i)
min = i;
if (max < i)
max = i;
}
}
Console.WriteLine(min + " " + max);
}
public static void Main(String[] args)
{
int [] arr = { 605, 986 };
int n = arr.Length;
int k = 548, x = 569;
xorOnSortedArray(arr, n, k, x);
}
}
|
Javascript
<script>
const MAX = 100000;
function xorOnSortedArray(arr, n, k, x)
{
let arr1 = new Array(MAX + 1).fill(0);
let arr2 = new Array(MAX + 1).fill(0);
let xor_val = new Array(MAX + 1);
for (let i = 0; i < n; i++)
arr1[arr[i]]++;
for (let i = 0; i <= MAX; i++)
xor_val[i] = i ^ x;
while (k--) {
let count = 0;
for (let i = 0; i <= MAX; i++) {
let store = arr1[i];
if (arr1[i] > 0) {
if (count % 2 == 0) {
let div = Math.ceil(arr1[i] / 2);
arr1[i] = arr1[i] - div;
arr2[xor_val[i]] += div;
}
else if (count % 2 != 0) {
let div = parseInt(arr1[i] / 2);
arr1[i] = arr1[i] - div;
arr2[xor_val[i]] += div;
}
}
count = count + store;
}
for (let i = 0; i <= MAX; i++) {
arr1[i] = arr1[i] + arr2[i];
arr2[i] = 0;
}
}
let min = Number.MAX_VALUE;
let max = Number.MIN_VALUE;
for (let i = 0; i <= MAX; i++) {
if (arr1[i] > 0) {
if (min > i)
min = i;
if (max < i)
max = i;
}
}
document.write(min + " " + max);
}
let arr = [ 605, 986 ];
let n = arr.length;
let k = 548, x = 569;
xorOnSortedArray(arr, n, k, x);
</script>
|
Time Complexity: O(n + k * MAX)
Auxiliary Space: O(MAX)
Share your thoughts in the comments
Please Login to comment...