Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

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) 위치의 행렬 값은 왼쪽 위 모서리(0, 0)와 오른쪽 아래 모서리(R, C)에서 부분행렬의 XOR입니다.

먼저 접두사를 찾습니다. - 행렬의 모든 행에 대해 하나씩 XOR합니다. 그런 다음 각 열에 대한 접두사 XOR을 하나씩 계산합니다.

(r1, c1)에서 (r2, c2)로 주어진 쿼리에 대한 부분행렬의 XOR을 찾기 위해 prefixXor[r2][c2] ^ prefixXor[r1-1][c2] ^ prefixXor[r2][c1 -1] ^ 접두사Xor[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