Make Array elements equal by replacing adjacent elements with their XOR
Last Updated :
11 Sep, 2021
Given an array A[] consisting of N integers, the task is to check if it is possible to reduce array of at least length 2 such that all the elements in the array are equal. In an operation, choose any index i, and replace A[i] and A[i+1] with their XOR value.
Example:
Input: A[] = {0, 2, 2}
Output: YES
Explanation: Apply the given operation for i=0 (zero based indexing). Therefore, replace A[0] and A[1] to A[0]^A[1] i.e., 0^2->2. The resulting array is {2, 2} having all the elements equal.
Input: A[] = {2, 3, 1, 10}
Output: NO
Explanation: There is no possible way for the array to have all equal elements
Naive Approach: The above problem can be solved using the observation that the given array can be reduced to an array with either two equal elements or three equal elements. Below are the steps by step approach to solve the above problem:
- Create a prefix array in which the ith index stores the XOR of elements from index 0 to i of the array A[].
- Case 1 where the array can be reduced to two equal elements
- Suppose the resulting array is {X, X}. Since the XOR of all elements of the array will remain constant, therefore X^X=0=XOR( A[0...N-1]). This case can be easily handled by checking if the XOR of all the elements of the array is 0.
- Case 2 where the array can be reduced to three equal elements
- This case can be handled by iterating over all the possible values of (i, j) such that 0<= i < j <=N-1 and check if there exist a value of (i, j) such that XOR(A[0...i]) = XOR(A[i+1...j]) = XOR(A[j+1...N]).
Below is the implementation of the above approach:
C++
// C++ Program of the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to check if it is possible
// to make all the array elements equal
// using the given operation
void possibleEqualArray(int A[], int N)
{
// Stores the prefix XOR array
vector<int> pref(N);
pref[0] = A[0];
for (int i = 1; i < N; i++) {
// Calculate prefix[i]
pref[i] = pref[i - 1] ^ A[i];
}
// Case 1, check if the XOR of
// the input array is 0
if (pref[N - 1] == 0) {
cout << "YES";
return;
}
// Case 2
// Iterate over all the ways to
// divide the array into three
// non empty subarrays
int cur_xor = 0;
for (int i = N - 1; i >= 0; i--) {
cur_xor ^= A[i];
for (int j = 0; j < i; j++) {
if (j) {
// XOR of Middle Block
int middle_xor
= pref[j - 1] ^ pref[i - 1];
// XOR of Left Block
int left_xor = pref[j - 1];
// XOR of Right Block
int right_xor = cur_xor;
if (left_xor == middle_xor
&& middle_xor == right_xor) {
cout << "YES";
return;
}
}
}
}
// Not Possible
cout << "NO";
}
// Driver Code
int main()
{
int A[] = { 0, 2, 2 };
int N = sizeof(A) / sizeof(int);
// Function Call
possibleEqualArray(A, N);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
class GFG
{
// Function to check if it is possible
// to make all the array elements equal
// using the given operation
static void possibleEqualArray(int A[], int N)
{
// Stores the prefix XOR array
int[] pref= new int[N];
pref[0] = A[0];
for (int i = 1; i < N; i++) {
// Calculate prefix[i]
pref[i] = pref[i - 1] ^ A[i];
}
// Case 1, check if the XOR of
// the input array is 0
if (pref[N - 1] == 0) {
System.out.println("YES");
return;
}
// Case 2
// Iterate over all the ways to
// divide the array into three
// non empty subarrays
int cur_xor = 0;
for (int i = N - 1; i >= 0; i--) {
cur_xor ^= A[i];
for (int j = 0; j < i; j++) {
if (j!=0) {
// XOR of Middle Block
int middle_xor
= pref[j - 1] ^ pref[i - 1];
// XOR of Left Block
int left_xor = pref[j - 1];
// XOR of Right Block
int right_xor = cur_xor;
if (left_xor == middle_xor
&& middle_xor == right_xor) {
System.out.println( "YES");
return;
}
}
}
}
// Not Possible
System.out.println( "NO");
}
// Driver code
public static void main (String[] args)
{
int A[] = { 0, 2, 2 };
int N = A.length;
// Function Call
possibleEqualArray(A, N);
}
}
// This code is contributed by Potta Lokesh
Python3
# Python 3 Program of the above approach
# Function to check if it is possible
# to make all the array elements equal
# using the given operation
def possibleEqualArray(A, N):
# Stores the prefix XOR array
pref = [0 for i in range(N)]
pref[0] = A[0]
for i in range(1, N, 1):
# Calculate prefix[i]
pref[i] = pref[i - 1] ^ A[i]
# Case 1, check if the XOR of
# the input array is 0
if (pref[N - 1] == 0):
print("YES")
return
# Case 2
# Iterate over all the ways to
# divide the array into three
# non empty subarrays
cur_xor = 0
i = N - 1
while(i >= 0):
cur_xor ^= A[i]
for j in range(i):
if (j):
# XOR of Middle Block
middle_xor = pref[j - 1] ^ pref[i - 1]
# XOR of Left Block
left_xor = pref[j - 1]
# XOR of Right Block
right_xor = cur_xor
if (left_xor == middle_xor and middle_xor == right_xor):
print("YES")
return
i -= 1
# Not Possible
print("NO")
# Driver Code
if __name__ == '__main__':
A = [0, 2, 2]
N = len(A)
# Function Call
possibleEqualArray(A, N)
# This code is contributed by ipg2016107.
C#
// C# program for the above approach
using System;
public class GFG
{
// Function to check if it is possible
// to make all the array elements equal
// using the given operation
static void possibleEqualArray(int []A, int N)
{
// Stores the prefix XOR array
int[] pref= new int[N];
pref[0] = A[0];
for (int i = 1; i < N; i++) {
// Calculate prefix[i]
pref[i] = pref[i - 1] ^ A[i];
}
// Case 1, check if the XOR of
// the input array is 0
if (pref[N - 1] == 0) {
Console.WriteLine("YES");
return;
}
// Case 2
// Iterate over all the ways to
// divide the array into three
// non empty subarrays
int cur_xor = 0;
for (int i = N - 1; i >= 0; i--) {
cur_xor ^= A[i];
for (int j = 0; j < i; j++) {
if (j!=0) {
// XOR of Middle Block
int middle_xor
= pref[j - 1] ^ pref[i - 1];
// XOR of Left Block
int left_xor = pref[j - 1];
// XOR of Right Block
int right_xor = cur_xor;
if (left_xor == middle_xor
&& middle_xor == right_xor) {
Console.WriteLine( "YES");
return;
}
}
}
}
// Not Possible
Console.WriteLine( "NO");
}
// Driver code
public static void Main(String[] args)
{
int []A = { 0, 2, 2 };
int N = A.Length;
// Function Call
possibleEqualArray(A, N);
}
}
// This code is contributed by 29AjayKumar
JavaScript
<script>
// Javascript Program of the above approach
// Function to check if it is possible
// to make all the array elements equal
// using the given operation
function possibleEqualArray(A, N) {
// Stores the prefix XOR array
let pref = new Array(N);
pref[0] = A[0];
for (let i = 1; i < N; i++) {
// Calculate prefix[i]
pref[i] = pref[i - 1] ^ A[i];
}
// Case 1, check if the XOR of
// the input array is 0
if (pref[N - 1] == 0) {
document.write("YES");
return;
}
// Case 2
// Iterate over all the ways to
// divide the array into three
// non empty subarrays
let cur_xor = 0;
for (let i = N - 1; i >= 0; i--) {
cur_xor ^= A[i];
for (let j = 0; j < i; j++) {
if (j) {
// XOR of Middle Block
let middle_xor = pref[j - 1] ^ pref[i - 1];
// XOR of Left Block
let left_xor = pref[j - 1];
// XOR of Right Block
let right_xor = cur_xor;
if (left_xor == middle_xor && middle_xor == right_xor) {
document.write("YES");
return;
}
}
}
}
// Not Possible
document.write("NO");
}
// Driver Code
let A = [0, 2, 2];
let N = A.length;
// Function Call
possibleEqualArray(A, N);
// This code is contributed by _saurabh_jaiswal.
</script>
Time Complexity: O(N2)
Space Complexity: O(N)
Efficient Approach: The above approach can be optimized using the observation that in the case where the array can be reduced to the three equal elements, the resultant array can be represented as {X, X, X}. Since, (X^X^X) = XOR(A[0...N-1]) it implies that X = XOR(A[0...N-1]). Case 1 can be handled the same as that of the naive approach. Case 2 can be solved as follows:
- Initialize cnt and cur_XOR by 0, and store the XOR of all elements of A[] in tot_XOR.
- Iterate over array A[] and keep track of the XOR till the current element in cur_XOR.
- If cur_XOR = tot_XOR, increment the cnt by 1 and initialize cur_XOR = 0.
- After traversing the whole array, if the value of cnt > 2, it is possible to make all the elements of the array equal using the given operation.
Below is the implementation of the above approach:
C++
// C++ Program of the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to check if it is possible
// to make all the array elements equal
// using the given operation
void possibleEqualArray(int A[], int N)
{
// Stores the XOR of all
// elements of array A[]
int tot_XOR = 0;
for (int i = 0; i < N; i++) {
tot_XOR ^= A[i];
}
// Case 1, check if the XOR of
// the array A[] is 0
if (tot_XOR == 0) {
cout << "YES";
return;
}
// Case 2
// Maintains the XOR till
// the current element
int cur_XOR = 0;
int cnt = 0;
// Iterate over the array
for (int i = 0; i < N; i++) {
cur_XOR ^= A[i];
// If the current XOR is equal
// to the total XOR increment
// the count and initialize
// current XOR as 0
if (cur_XOR == tot_XOR) {
cnt++;
cur_XOR = 0;
}
}
// Print Answer
if (cnt > 2) {
cout << "YES";
}
else {
cout << "NO";
}
}
// Driver Code
int main()
{
int A[] = { 0, 2, 2 };
int N = sizeof(A) / sizeof(int);
// Function Call
possibleEqualArray(A, N);
return 0;
}
Java
// Java Program of the above approach
import java.util.*;
class GFG{
// Function to check if it is possible
// to make all the array elements equal
// using the given operation
static void possibleEqualArray(int A[], int N)
{
// Stores the XOR of all
// elements of array A[]
int tot_XOR = 0;
for (int i = 0; i < N; i++) {
tot_XOR ^= A[i];
}
// Case 1, check if the XOR of
// the array A[] is 0
if (tot_XOR == 0) {
System.out.print("YES");
return;
}
// Case 2
// Maintains the XOR till
// the current element
int cur_XOR = 0;
int cnt = 0;
// Iterate over the array
for (int i = 0; i < N; i++) {
cur_XOR ^= A[i];
// If the current XOR is equal
// to the total XOR increment
// the count and initialize
// current XOR as 0
if (cur_XOR == tot_XOR) {
cnt++;
cur_XOR = 0;
}
}
// Print Answer
if (cnt > 2) {
System.out.print("YES");
}
else {
System.out.print("NO");
}
}
// Driver Code
public static void main(String[] args)
{
int A[] = { 0, 2, 2 };
int N =( A.length);
// Function Call
possibleEqualArray(A, N);
}
}
// This code is contributed by 29AjayKumar
Python3
# Python 3 Program of the above approach
# Function to check if it is possible
# to make all the array elements equal
# using the given operation
def possibleEqualArray(A, N):
# Stores the XOR of all
# elements of array A[]
tot_XOR = 0
for i in range(N):
tot_XOR ^= A[i]
# Case 1, check if the XOR of
# the array A[] is 0
if (tot_XOR == 0):
print("YES")
return
# Case 2
# Maintains the XOR till
# the current element
cur_XOR = 0
cnt = 0
# Iterate over the array
for i in range(N):
cur_XOR ^= A[i]
# If the current XOR is equal
# to the total XOR increment
# the count and initialize
# current XOR as 0
if (cur_XOR == tot_XOR):
cnt += 1
cur_XOR = 0
# Print Answer
if (cnt > 2):
print("YES")
else:
print("NO")
# Driver Code
if __name__ == '__main__':
A = [0, 2, 2]
N = len(A)
# Function Call
possibleEqualArray(A, N)
# This code is contributed by SURENDRA_GANGWAR.
C#
// C# Program of the above approach
using System;
class GFG{
// Function to check if it is possible
// to make all the array elements equal
// using the given operation
static void possibleEqualArray(int []A, int N)
{
// Stores the XOR of all
// elements of array A[]
int tot_XOR = 0;
for (int i = 0; i < N; i++) {
tot_XOR ^= A[i];
}
// Case 1, check if the XOR of
// the array A[] is 0
if (tot_XOR == 0) {
Console.Write("YES");
return;
}
// Case 2
// Maintains the XOR till
// the current element
int cur_XOR = 0;
int cnt = 0;
// Iterate over the array
for (int i = 0; i < N; i++) {
cur_XOR ^= A[i];
// If the current XOR is equal
// to the total XOR increment
// the count and initialize
// current XOR as 0
if (cur_XOR == tot_XOR) {
cnt++;
cur_XOR = 0;
}
}
// Print Answer
if (cnt > 2) {
Console.Write("YES");
}
else {
Console.Write("NO");
}
}
// Driver Code
public static void Main(String[] args)
{
int []A = { 0, 2, 2 };
int N =( A.Length);
// Function Call
possibleEqualArray(A, N);
}
}
// This code is contributed by shivanisinghss2110.
JavaScript
<script>
// JavaScript Program of the above approach
// Function to check if it is possible
// to make all the array elements equal
// using the given operation
function possibleEqualArray( A, N)
{
// Stores the XOR of all
// elements of array A[]
var tot_XOR = 0;
for (var i = 0; i < N; i++) {
tot_XOR ^= A[i];
}
// Case 1, check if the XOR of
// the array A[] is 0
if (tot_XOR == 0) {
document.write("YES");
return;
}
// Case 2
// Maintains the XOR till
// the current element
var cur_XOR = 0;
var cnt = 0;
// Iterate over the array
for (var i = 0; i < N; i++) {
cur_XOR ^= A[i];
// If the current XOR is equal
// to the total XOR increment
// the count and initialize
// current XOR as 0
if (cur_XOR == tot_XOR) {
cnt++;
cur_XOR = 0;
}
}
// Print Answer
if (cnt > 2) {
document.write("YES");
}
else {
document.write("NO");
}
}
// Driver Code
var A = [ 0, 2, 2 ];
var N =( A.length);
// Function Call
possibleEqualArray(A, N);
// This code is contributed by shivanisinghss2110
</script>
Time Complexity: O(N)
Auxiliary Space: O(1)
Similar Reads
Make all Array elements equal by replacing it with adjacent elements
Given an array A[] of size N, the task is to find the minimum number of moves required to make array elements equal where you can make adjacent elements equal in one move. Examples: Input: A = {1, 6, 5, 1, 7, 1}, N = 6Output: 3Explanation: Replace 6 with 1, 5 with 1, and then at last replace 7 with
5 min read
Make all array elements even by replacing adjacent pair of array elements with their sum
Given an array arr[] of size N, the task is to make all array elements even by replacing a pair of adjacent elements with their sum. Examples: Input: arr[] = { 2, 4, 5, 11, 6 }Output: 1Explanation:Replacing a pair (arr[2], arr[3]) with their sum ( = 5 + 11 = 16) modifies arr[] to { 2, 4, 16, 16, 6 }
8 min read
Make all array elements equal by replacing triplets with their Bitwise XOR
Given an array arr[] of size N, the task is to find all the triplets (i, j, k) such that replacing the elements of the triplets with their Bitwise XOR values, i.e. replacing arr[i], arr[j], arr[k] with (arr[i] ^ arr[j] ^ arr[k]) makes all array elements equal. If more than one solution exists, print
10 min read
Make all array elements equal by replacing adjacent pairs by their sum
Given an array arr[] consisting of N integers, the task is to replace a minimum number of pairs of adjacent elements by their sum to make all array elements equal. Print the minimum number of such operations required. Examples: Input: arr[] = {1, 2, 3}Output: 1Explanation: Replace arr[0] and arr[1]
8 min read
Make all array elements even by replacing any pair of array elements with their sum
Given an array arr[] consisting of N positive integers, the task is to make all array elements even by replacing any pair of array elements with their sum. Examples: Input: arr[] = {5, 6, 3, 7, 20}Output: 3Explanation: Operation 1: Replace arr[0] and arr[2] by their sum ( = 5 + 3 = 8) modifies arr[]
5 min read
Check if the array has an element which is equal to XOR of remaining elements
Given an array arr[] of N elements, the task is to check if the array has an element which is equal to the XOR of all the remaining elements.Examples: Input: arr[] = { 8, 2, 4, 15, 1 } Output: Yes 8 is the required element as 2 ^ 4 ^ 15 ^ 1 = 8.Input: arr[] = {4, 2, 3} Output: No Approach: First, ta
5 min read
Replace specified matrix elements such that no two adjacent elements are equal
Given a matrix arr[][] of dimensions N * M, consisting of 'O' or 'F', where 'O' denotes obstacles and 'F' denotes free spaces, the task is to replace all 'F's in the given matrix by either '1' or '2', such that no two adjacent cells have the same value. Examples: Input: N = 4, M = 4, arr[][] = {{'F'
15+ min read
Find array whose elements are XOR of adjacent elements in given array
Given an array arr[] consisting of N integers, the task is to re-construct an array arr[] such that the values in arr[] are obtained by doing XOR of the adjacent elements in the array. Print the array elements. Examples: Input: arr[ ] = {10, 11, 1, 2, 3} Output: 1 10 3 1 3 Explanation: At index 0, a
5 min read
Check if Arrays can be made equal by Replacing elements with their number of Digits
Given two arrays A[] and B[] of length N, the task is to check if both arrays can be made equal by performing the following operation at most K times: Choose any index i and either change Ai to the number of digits Ai have or change Bi to the number of digits Bi have. Examples: Input: N = 4, K = 1,
10 min read
Kth array element after M replacements of array elements by XOR of adjacent pairs
Given an array arr[] of size N and two integers M and K, the task is to find the array element at the Kth index after performing following M operations on the given array. In a single operation, a new array is formed whose elements have the Bitwise XOR values of the adjacent elements of the current
14 min read