// C# program to implement the above approach
using System;
using System.Collections.Generic;
public class GFG
{
static int N =101;
// Compute the xor of elements from (1, 1) to
// (i, j) and store it in prefix_xor[i,j]
static void prefix(int [,]arr, int [,]prefix_xor, int n)
{
for (int i = 1; i < n; i++)
{
for (int j = 1; j < n; j++)
{
// xor of submatrix from 1, 1 to i, j is
// (xor of submatrix from 1, 1 to i-1,
// j )^(xor of submatrix from 1, 1 to i, j-1)
// ^(xor of submatrix from 1, 1 to i-1, j-1) ^
// arr[i,j]
prefix_xor[i,j] = arr[i,j] ^
prefix_xor[i - 1,j] ^
prefix_xor[i,j - 1] ^
prefix_xor[i - 1,j - 1];
}
}
}
// find the submatrix with maximum xor value
static void Max_xor(int [,]prefix_xor, int n)
{
int max_value = 0;
// we need four loops to find all the submatrix
// of a matrix
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
for (int i1 = i; i1 <= n; i1++)
{
for (int j1 = j; j1 <= n; j1++)
{
// xor of submatrix from i, j to i1, j1 is
// (xor of submatrix from 1, 1 to i1, j1 )
// ^(xor of submatrix from 1, 1 to i-1, j-1)
// ^(xor of submatrix from 1, 1 to i1, j-1)
// ^(xor of submatrix from 1, 1 to i-1, j1)
int x = 0;
x ^= prefix_xor[i1, j1];
x ^= prefix_xor[i - 1, j - 1];
x ^= prefix_xor[i1, j - 1];
x ^= prefix_xor[i - 1, j1];
// if the xor is greater than maximum value
// substitute it
max_value = Math.Max(max_value, x);
}
}
}
}
Console.WriteLine(max_value);
}
// Driver code
public static void Main(String[] args)
{
int [,]arr = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
int n = 4;
int [,]prefix_xor = new int[N,N];
// Find the prefix_xor
prefix(arr, prefix_xor, n);
// Find submatrix with maximum bitwise xor
Max_xor(prefix_xor, n);
}
}
// This code is contributed by 29AjayKumar