// C# program for the
// above approach
using System;
class GFG{
// Dp table to store
// the sub-problems
static int[,,,] dp =
new int[20, 20,
20, 20];
// Function to find the
// maximum XOR value after
// rearranging the digits
static int maxXorValue(int i, String s1,
String s2, String s3,
int ones1, int ones2,
int ones3, int n)
{
// Base Case
if (i >= n)
return 0;
// Return if already calculated
if (dp[i, ones1,
ones2, ones3] != -1)
return dp[i, ones1,
ones2, ones3];
int option1 = 0, option2 = 0,
option3 = 0, option4 = 0,
option5 = 0, option6 = 0,
option7 = 0, option8 = 0;
// Assigning 1's to all
// string at position 'i'.
if (ones1 > 0 && ones2 > 0 &&
ones3 > 0)
// 2^(n-1-i) is the value
// added to the total
option1 = (1 << ((n - 1) - i)) +
maxXorValue(i + 1, s1,
s2, s3,
ones1 - 1,
ones2 - 1,
ones3 - 1, n);
// Assigning 1's to
// strings 1 & 2
if (ones1 > 0 && ones2 > 0 &&
(n - i > ones3))
option2 = 0 + maxXorValue(i + 1, s1, s2,
s3, ones1 - 1,
ones2 - 1,
ones3, n);
// Assigning 1's to strings 2 & 3
if (ones2 > 0 && ones3 > 0 &&
(n - i > ones1))
option3 = 0 + maxXorValue(i + 1, s1, s2,
s3, ones1,
ones2 - 1,
ones3 - 1, n);
// Assigning 1's to strings 3 & 1
if (ones3 > 0 && ones1 > 0 &&
(n - i > ones2))
option4 = 0 + maxXorValue(i + 1, s1, s2,
s3, ones1 - 1,
ones2,
ones3 - 1, n);
// Assigning 1 to string 1
if (ones1 > 0 && (n - i > ones2) &&
(n - i > ones3))
option5 = (1 << ((n - 1) - i)) +
maxXorValue(i + 1, s1,
s2,s3,
ones1 - 1,
ones2, ones3, n);
// Assigning 1 to string 2
if (ones2 > 0 && (n - i > ones3) &&
(n - i > ones1))
option6 = (1 << ((n - 1) - i)) +
maxXorValue(i + 1, s1,
s2, s3,
ones1,
ones2 - 1,
ones3, n);
// Assigning 1 to string 3.
if (ones3 > 0 && (n - i > ones2) &&
(n - i > ones1))
option7 = (1 << ((n - 1) - i)) +
maxXorValue(i + 1, s1,
s2, s3,
ones1,
ones2,
ones3 - 1, n);
// Assigning 0 to all the strings
if ((n - i > ones2) &&
(n - i > ones3) &&
(n - i > ones1))
option8 = 0 + maxXorValue(i + 1,
s1, s2,
s3, ones1,
ones2, ones3, n);
// Take the maximum amongst all of
// the above solutions
return dp[i, ones1,
ones2, ones3] = Math.Max(option1,
Math.Max(option2,
Math.Max(option3,
Math.Max(option4,
Math.Max(option5,
Math.Max(option6,
Math.Max(option7,
option8)))))));
}
// Function to get the count
// of ones in the string s
static int onesCount(String s)
{
int count = 0;
// Traverse the string
foreach(char x in s.ToCharArray())
{
if (x == '1')
++count;
}
// Return the count
return count;
}
// Utility Function to find the maximum
// XOR value after rearranging the digits
static void maxXORUtil(String s1, String s2,
String s3, int n)
{
// Find the count of ones in
// each of the strings
int ones1 = onesCount(s1);
int ones2 = onesCount(s2);
int ones3 = onesCount(s3);
// Initialize dp table with -1
for(int i = 0; i < 20; i++)
{
for(int j = 0; j < 20; j++)
{
for(int l = 0; l < 20; l++)
for(int k = 0; k < 20; k++)
dp[i, j, l, k] =- 1;
}
}
// Function Call
Console.WriteLine(maxXorValue(0, s1, s2, s3,
ones1, ones2,
ones3, n));
}
// Driver code
public static void Main(String[] args)
{
String s1 = "11110";
String s2 = "10101";
String s3 = "00111";
int n = s1.Length;
// Function call
maxXORUtil(s1, s2, s3, n);
}
}
// This code is contributed by 29AjayKumar