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

📅  最后修改于: 2021-05-25 05:48:24             🧑  作者: 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的异或)。
我们必须运行四个循环以找出数组的所有子矩阵,并且可以在O(1)时间中计算子矩阵的xor。
因此时间复杂度降低为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


Javascript


输出:
31