# Find maximum xor of k elements in an array

• Difficulty Level : Expert
• Last Updated : 22 Dec, 2021

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 ``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`

## Python3

 `# Python implementation of the approach` `MAX` `=` `10000``MAX_ELEMENT ``=` `50` `dp ``=``[[[``-``1` `for` `i ``in` `range``(``MAX``)]``    ``for` `j ``in` `range``(MAX_ELEMENT)]``    ``for` `k ``in` `range``(MAX_ELEMENT)]` `# Function to return the maximum xor for a``# subset of size j from the given array``def` `Max_Xor(arr, i, j, mask, 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``    ``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))``    ``dp[i][j][mask] ``=` `ans``    ``return` `ans` `# Driver code``arr ``=` `[``2``, ``5``, ``4``, ``1``, ``3``, ``7``, ``6``, ``8``]``n ``=` `len``(arr)``k ``=` `3` `print``(Max_Xor(arr, ``0``, k, ``0``, n))` `# This code is contributed by shubhamsingh10`

## 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`

## Javascript

 ``
Output:
`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 ``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 j 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 j 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`

## Python3

 `# Python implementation of the approach` `MAX` `=` `10000``MAX_ELEMENT ``=` `50` `dp ``=``[[[``-``1` `for` `i ``in` `range``(``MAX``)] ``for` `j ``in` `range``(MAX_ELEMENT)] ``for` `k ``in` `range``(MAX_ELEMENT)]` `# Function to return the maximum xor for a``# subset of size j from the given array``def` `Max_Xor(arr, i, j, mask, 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``    ``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))``    ``dp[i][j][mask] ``=` `ans``    ``return` `ans`  `# Driver code` `arr ``=` `[``2``, ``5``, ``4``, ``1``, ``3``, ``7``, ``6``, ``8``]``n ``=` `len``(arr)``k ``=` `3` `print``(Max_Xor(arr, ``0``, k, ``0``, n))` `# This code is contributed by shubhamsingh10`

## C#

 `// C# implementation of the approach``using` `System;` `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 j 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 ()``  ``{``    ``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;``      ``}``    ``}` `    ``Console.WriteLine(Max_Xor(arr, 0, k, 0, n));``  ``}``}` `// This code is contributed by target_2.`
Output:
`15`

My Personal Notes arrow_drop_up