Find maximum xor of k elements in an array
Given an array arr[] of N integers and an integer K. The task is to find the maximum xor subset of size K of the given array.
Examples:
Input: arr[] = {2, 5, 4, 1, 3, 7, 6, 8}, K = 3
Output: 15
We obtain 15 by selecting 4, 5, 6, 8
Input: arr[] = {3, 4, 7, 7, 9}, K = 3
Output: 14
Naive approach: Iterate over all subsets of size K of the array and find maximum xor among them.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function to return the maximum xor for a // subset of size k from the given array int Max_Xor(int arr[], int n, int k) { // Initialize result int maxXor = INT_MIN; // Traverse all subsets of the array for (int i = 0; i < (1 << n); i++) { // __builtin_popcount() returns the number // of sets bits in an integer if (__builtin_popcount(i) == k) { // Initialize current xor as 0 int cur_xor = 0; for (int j = 0; j < n; j++) { // If jth bit is set in i then include // jth element in the current xor if (i & (1 << j)) cur_xor = cur_xor ^ arr[j]; } // Update maximum xor so far maxXor = max(maxXor, cur_xor); } } return maxXor; } // Driver code int main() { int arr[] = { 2, 5, 4, 1, 3, 7, 6, 8 }; int n = sizeof(arr) / sizeof(int); int k = 3; cout << Max_Xor(arr, n, k); return 0; } |
Java
// Java implementation of the approach import java.util.*; class GFG { // Function to return the maximum xor for a // subset of size k from the given array static int Max_Xor(int arr[], int n, int k) { // Initialize result int maxXor = Integer.MIN_VALUE; // Traverse all subsets of the array for (int i = 0; i < (1 << n); i++) { // __builtin_popcount() returns the number // of sets bits in an integer if (Integer.bitCount(i) == k) { // Initialize current xor as 0 int cur_xor = 0; for (int j = 0; j < n; j++) { // If jth bit is set in i then include // jth element in the current xor if ((i & (1 << j)) == 0) cur_xor = cur_xor ^ arr[j]; } // Update maximum xor so far maxXor = Math.max(maxXor, cur_xor); } } return maxXor; } // Driver code public static void main(String[] args) { int arr[] = { 2, 5, 4, 1, 3, 7, 6, 8 }; int n = arr.length; int k = 3; System.out.println(Max_Xor(arr, n, k)); } } // This code is contributed by PrinciRaj1992 |
C#
// C# implementation of the approach using System; class GFG { // Function to return the maximum xor for a // subset of size k from the given array static int Max_Xor(int []arr, int n, int k) { // Initialize result int maxXor = int.MinValue; // Traverse all subsets of the array for (int i = 0; i < (1 << n); i++) { // __builtin_popcount() returns the number // of sets bits in an integer if (bitCount(i) == k) { // Initialize current xor as 0 int cur_xor = 0; for (int j = 0; j < n; j++) { // If jth bit is set in i then include // jth element in the current xor if ((i & (1 << j)) == 0) cur_xor = cur_xor ^ arr[j]; } // Update maximum xor so far maxXor = Math.Max(maxXor, cur_xor); } } return maxXor; } static int bitCount(long x) { int setBits = 0; while (x != 0) { x = x & (x - 1); setBits++; } return setBits; } // Driver code public static void Main(String[] args) { int []arr = { 2, 5, 4, 1, 3, 7, 6, 8 }; int n = arr.Length; int k = 3; Console.WriteLine(Max_Xor(arr, n, k)); } } // This code is contributed by Princi Singh |
15
Efficient approach: The problem can be solved using dynamic programming. Create a dp table dp[i][j][mask] which stores the maximum xor possible at the ith index (with or without including it) and j denotes the number of remaining elements we can include in our subset of K elements. Mask is the xor of all the elements selected till the ith index.
Note: This approach will only work for smaller arrays due to space requirements for the dp array.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; #define MAX 10000 #define MAX_ELEMENT 50 int dp[MAX_ELEMENT][MAX_ELEMENT][MAX]; // Function to return the maximum xor for a // subset of size k from the given array int Max_Xor(int arr[], int i, int j, int mask, int n) { if (i >= n) { // If the subset is complete then return // the xor value of the selected elements if (j == 0) return mask; else return 0; } // Return if already calculated for some // mask and j at the i'th index if (dp[i][j][mask] != -1) return dp[i][j][mask]; // Initialize answer to 0 int ans = 0; // If we can still include elements in our subset // include the i'th element if (j > 0) ans = Max_Xor(arr, i + 1, j - 1, mask ^ arr[i], n); // Exclude the i'th element // ans store the max of both operations ans = max(ans, Max_Xor(arr, i + 1, j, mask, n)); return dp[i][j][mask] = ans; } // Driver code int main() { int arr[] = { 2, 5, 4, 1, 3, 7, 6, 8 }; int n = sizeof(arr) / sizeof(int); int k = 3; memset(dp, -1, sizeof(dp)); cout << Max_Xor(arr, 0, k, 0, n); return 0; } |
Java
// Java implementation of the approach import java.util.*; class GFG { static int MAX = 10000; static int MAX_ELEMENT = 50; static int [][][] dp = new int[MAX_ELEMENT][MAX_ELEMENT][MAX]; // Function to return the maximum xor for a // subset of size k from the given array static int Max_Xor(int arr[], int i, int j, int mask, int n) { if (i >= n) { // If the subset is complete then return // the xor value of the selected elements if (j == 0) return mask; else return 0; } // Return if already calculated for some // mask and j at the i'th index if (dp[i][j][mask] != -1) return dp[i][j][mask]; // Initialize answer to 0 int ans = 0; // If we can still include elements in our subset // include the i'th element if (j > 0) ans = Max_Xor(arr, i + 1, j - 1, mask ^ arr[i], n); // Exclude the i'th element // ans store the max of both operations ans = Math.max(ans, Max_Xor(arr, i + 1, j, mask, n)); return dp[i][j][mask] = ans; } // Driver code public static void main(String[] args) { int arr[] = { 2, 5, 4, 1, 3, 7, 6, 8 }; int n = arr.length; int k = 3; for(int i = 0; i < MAX_ELEMENT; i++) { for(int j = 0; j < MAX_ELEMENT; j++) { for(int l = 0; l < MAX; l++) dp[i][j][l] = -1; } } System.out.println(Max_Xor(arr, 0, k, 0, n)); } } // This code is contributed by Princi Singh |
15
Recommended Posts:
- Find the maximum elements in the first and the second halves of the Array
- Find all numbers that divide maximum array elements
- Find a number that divides maximum array elements
- Find maximum points which can be obtained by deleting elements from array
- Find integers that divides maximum number of elements of the array
- Recursive Programs to find Minimum and Maximum elements of array
- Find maximum array sum after making all elements same with repeated subtraction
- Sum of elements in 1st array such that number of elements less than or equal to them in 2nd array is maximum
- Find all unique pairs of maximum and second maximum elements over all sub-arrays in O(NlogN)
- Maximum in array which is at-least twice of other elements
- Maximum value K such that array has at-least K elements that are >= K
- Find original array from encrypted array (An array of sums of other elements)
- Find elements larger than half of the elements in an array
- Maximum set bit sum in array without considering adjacent elements
- Maximum length of the sub-array whose first and last elements are same
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.


