C ++中子矩阵查询的XOR

在这个问题中,我们得到一个N x N矩阵和一些查询,每个查询都包含从该矩阵创建的子矩阵的左上角和右下角。我们的任务是找到查询所定义的子矩阵的所有元素的XOR。

让我们举个例子来了解这个问题,

输入值

arr[][] = {{1, 2, 3}

{4, 5, 6}

{7, 8, 9}}

Querries: {0,0, 1,2} , {1, 2, 2, 2}

输出结果

1 15

讲解

querry 1 : 1^2^3^4^5^6

querry 2 : 6^9

为了解决这个问题,我们将找到一个前缀XOR矩阵来解决查询。位置(R,C)处的矩阵的值是子矩阵从位置(R,C)处的左上角(0,0)和右下角的XOR。

我们将首先为矩阵的所有行逐一找到前缀-XOR。然后一一计算每列的前缀XOR。

为了找到由(r1,c1)到(r2,c2)给出的查询的子矩阵的XOR,使用prefixXor [r2] [c2] ^ prefixXor [r1-1] [c2] ^ prefixXor [r2] [c1 -1] ^ prefixXor [r1-1] [c1-1]。

显示我们解决方案实施情况的程序,

示例

#include <iostream>

using namespace std;

#define n 3

void preXOR(int arr[][n], int prefix_xor[][n]) {

   for (int i = 0; i < n; i++)

      for (int j = 0; j < n; j++) {

         if (j == 0)

            prefix_xor[i][j] = arr[i][j];

         else

         prefix_xor[i][j]

            = (prefix_xor[i][j - 1] ^ arr[i][j]);

      }

   for (int i = 0; i < n; i++)

      for (int j = 1; j < n; j++)

         prefix_xor[j][i]

            = (prefix_xor[j - 1][i] ^ prefix_xor[j][i]);

}

int XORSubMatrix(int prefix_xor[][n], int querry[2]) {

   int xor_1 = 0, xor_2 = 0, xor_3 = 0;

   if (querry[0] != 0)

      xor_1 = prefix_xor[querry[0] - 1][querry[3]];

   if (querry[1] != 0)

      xor_2 = prefix_xor[querry[2]][querry[1] - 1];

   if (querry[2] != 0 and querry[1] != 0)

      xor_3 = prefix_xor[querry[0] - 1][querry[1] - 1];

   return ((prefix_xor[querry[2]][querry[3]] ^ xor_1) ^ (xor_2 ^ xor_3));

}

int main() {

   int arr[][n] = { { 1, 2, 3 },

      { 4, 5, 6 },

      { 7, 8, 9 } };

   int prefix_xor[n][n];

   preXOR(arr, prefix_xor);

   int querry1[] = {0,0, 2,2} ;

   int querry2[] = {1,2, 2,2} ;

   cout<<"The XOR of submatrix created by querries :\n";

   cout<<"Querry 1 : "<<XORSubMatrix(prefix_xor, querry1)<<endl;

   cout<<"Querry 2 : "<<XORSubMatrix(prefix_xor, querry2)<<endl;

   return 0;

}

输出结果

Querry 1 : 1

Querry 2 : 15


以上是 C ++中子矩阵查询的XOR 的全部内容, 来源链接: utcz.com/z/335046.html

回到顶部