📜  查找具有最大XOR的子矩阵

📅  最后修改于: 2021-04-22 06:38:00             🧑  作者: Mango

问题给定N边的方阵,我们必须找到一个子矩阵,使其元素的按位XOR最大,并且必须打印最大的按位XOR。

例子:

Input : 
         matrix is
        { {1, 2, 3, 4}
          {5, 6, 7, 8}
          {9, 10, 11, 12}
          {13, 14, 15, 16} } 
Output : 31
We get the value 31 by doing XOR of submatrix [15, 16}

朴素方法蛮力方法是通过运行四个循环(两个用于开始行和列,两个用于结束行和列)来找到数组的所有子矩阵,然后找到子矩阵所有元素的异或,并找出异或。检查此子矩阵的xor是否最大。

时间复杂度:O(n ^ 6)

高效的方法在这种方法中,我们将计算从1,1到i,j的每个子矩阵的异或,这可以通过使用以下公式在O(N * N)中完成
(子矩阵从1,1到i,j的异或)=(子矩阵从1,1到i-1,j的异或)^(子矩阵从1,1到i,j-1的异或)^(子矩阵的异或从1,1到i-1,j-1)^ arr [i] [j]。
现在,为了计算从i,j到i1,j1的子矩阵的xor,我们可以使用以下公式
(子矩阵从i,j到i1,j1的异或)=(子矩阵从1,1到i1,j1的异或)^(子矩阵从1,1到i-1,j-1的异或)^(子矩阵的异或从1,1到i1,j-1)^(子矩阵从1,1到i-1,j1的异或)。
我们必须运行四个循环以找出数组的所有子矩阵,并且该子矩阵的xor可以在O(1)时间内计算出来。
因此时间复杂度降低为O(N ^ 4)

C++
// C++ program to implement the above approach
#include 
using namespace std;
#define N 101
  
// Compute the xor of elements from (1, 1) to 
// (i, j) and store it in prefix_xor[i][j]
void prefix(int arr[N][N], int prefix_xor[N][N], 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
void Max_xor(int prefix_xor[N][N], 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 = max(max_value, x);
                }
            }
        }
    }
    cout << max_value << endl;
}
  
// Driver code
int main()
{
    int arr[N][N] = { { 1, 2, 3, 4 },
                      { 5, 6, 7, 8 },
                      { 9, 10, 11, 12 },
                      { 13, 14, 15, 16 } };
  
    int n = 4;
    int prefix_xor[N][N] = { 0 };
  
    // Find the prefix_xor
    prefix(arr, prefix_xor, n);
  
    // Find submatrix with maximum bitwise xor
    Max_xor(prefix_xor, n);
  
    return 0;
}


Java
// Java program to implement the above approach
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);
                }
            }
        }
    }
    System.out.println(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


Python3
# Python3 program to implement the above approach
N = 101
  
# Compute the xor of elements from (1, 1) to
# (i, j) and store it in prefix_xor[i][j]
def prefix(arr, prefix_xor, n):
    for i in range(1, n):
        for j in range(1, n):
  
            # 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
def Max_xor(prefix_xor, n):
    max_value = 0
  
    # we need four loops to find 
    # all the submatrix of a matrix
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            for i1 in range(i, n + 1):
                for j1 in range(j, n + 1):
                      
                    # 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)
                    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 = max(max_value, x)
                      
    print(max_value)
  
# Driver code
arr = [[ 1, 2, 3, 4 ],
       [ 5, 6, 7, 8 ],
       [ 9, 10, 11, 12 ],
       [ 13, 14, 15, 16 ]]
  
n = 4
prefix_xor = [[ 0 for i in range(N)] 
                  for i in range(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 Mohit Kumar


C#
// C# program to implement the above approach
using System;
  
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() 
    {
        int [ , ] arr = new int [ , ] { { 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 ihritik


输出:
31