কম্পিউটার টিউটোরিয়াল

C++-এ সাবম্যাট্রিক্স কোয়েরিতে XOR

এই সমস্যায়, আমাদের একটি N x N ম্যাট্রিক্স এবং কিছু কোয়েরি দেওয়া আছে, প্রতিটি কোয়েরি এ ম্যাট্রিক্স থেকে বने সাবম্যাট্রিক্সের টপ-লেফট এবং বটম-রাইট কর্নার ধারণ করে। আমাদের কাজ হল কোয়েরি দিয়ে ডিফাইন করা সাবম্যাট্রিক্সের সব এলিমেন্টের XOR বের করা।

একটি উদাহরণ দিয়ে সমস্যাটি বুঝতে পারি,

ইনপুট

arr[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
Queries: {0,0, 1,2}, {1, 2, 2, 2}

আউটপুট

1 15

ব্যাখ্যা

query 1: 1^2^3^4^5^6
query 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] ^ 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 && 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 queries:\n";
    cout << "Query 1: " << XORSubMatrix(prefix_xor, querry1) << endl;
    cout << "Query 2: " << XORSubMatrix(prefix_xor, querry2) << endl;
    return 0;
}

আউটপুট

Query 1: 1
Query 2: 15
  1. C++-এ প্যালিনড্রোম সাবস্ট্রিং কোয়েরি সমাধান

  2. C++-এ সাবঅ্যারে XOR-এর XOR কোয়েরি সমাধান

  3. C++ রেঞ্জের সবচেয়ে বড় বিজোড় ভাজকের XOR-এ কোয়েরি

  4. C++ দিয়ে ট্রি-এ সাবট্রির DFS কোয়ারী সমাধান