Computer >> Máy Tính >  >> Lập trình >> C ++

Tìm số Tổng của XOR với Phạm vi mảng cho trước là Tối đa bằng cách sử dụng C ++

Để giải quyết một vấn đề trong đó chúng ta được cung cấp một mảng và một số truy vấn. Bây giờ trong mỗi truy vấn, chúng tôi được cung cấp một phạm vi. Bây giờ chúng ta cần tìm một số sao cho tổng xor của chúng với x là cực đại, chẳng hạn

Input : A = {20, 11, 18, 2, 13}
Three queries as (L, R) pairs
1 3
3 5
2 4
Output : 2147483629
2147483645
2147483645

Trong bài toán này, chúng ta sẽ đếm tiền tố của 1 trong các số ở mỗi vị trí bây giờ vì chúng ta đã tính toán trước số hàng của chúng ta, do đó, để tìm số lượng các đơn vị trong phạm vi đã cho từ L đến R, chúng ta cần trừ được giả định cho đến R với giả định cho đến L.

Phương pháp tiếp cận để tìm giải pháp

Trong cách tiếp cận này, vì chúng ta được yêu cầu phải tìm tổng lớn nhất, vì vậy chúng ta cần làm cho phần lớn các bit của x hoặc bằng 1; do đó chúng tôi kiểm tra xem đối với bất kỳ bit nào nếu một bit nhiều hơn số 0, vì vậy chúng tôi đặt lại bit đó của x vì bây giờ phần lớn số có bit đó bằng 1 vì vậy khi chúng tôi ghép phần lớn số 1 với số 0, vì vậy cuối cùng chúng tôi có phần lớn bit đó bằng 1 do đó đây là cách chúng tôi tối đa hóa câu trả lời của mình.

Ví dụ

Mã C ++ cho phương pháp tiếp cận trên

#include <bits/stdc++.h>
using namespace std;
#define MAX 2147483647 // 2^31 - 1
int prefix[100001][32]; // the prefix array
void prefix_bit(int A[], int n){ // taking prefix count of 1's present
    for (int j = 0; j < 32; j++) // we keep 0th count as 0 and our prefix array starts with index 1
        prefix[0][j] = 0;
    for (int i = 1; i <= n; i++){ // making our prefix array
        int a = A[i - 1]; // ith element
        for (int j = 0; j < 32; j++){ // as our number is less than 2^32 so we traverse for bit 0 to 31
            int x = 1 << j; // traversing in bits
            if (a & x) // if this bit is one so we make the prefix count as prevcount + 1
                prefix[i][j] = 1 + prefix[i - 1][j];
            else
                prefix[i][j] = prefix[i - 1][j];
       }
   }
}
int maximum_num(int l, int r){
    int numberofbits = r - l + 1; // the number of elements in the range hence the number of bits
    int X = MAX; // we take the max value such that all of it's bits are one
    // Iterating over each bit
    for (int i = 0; i < 31; i++){
        int x = prefix[r][i] - prefix[l - 1][i]; // calculating the number of set bits in the given range
        if (x >= numberofbits - x){ // is number of 1's is more than number of 0's
            int currentbit = 1 << i; // we set the current bit to prefix for toggling that bit in x
            X = X ^ currentbit; // we make toggle that bit from 1 to 0
        }
    }
    return X; // answer
}
int main(){
    int n = 5, q = 3; // number of element in our array and number of queries present
    int A[] = { 210, 11, 48, 22, 133 }; // elements in our array
    int L[] = { 1, 4, 2 }, R[] = { 3, 14, 4 }; // given queries
    prefix_bit(A, n); // creating prefix bit array
    for (int i = 0; i < q; i++)
       cout << maximum_num(L[i], R[i]) << "\n";
    return 0;
}

Đầu ra

2147483629
2147483647
2147483629

Giải thích về Quy tắc trên

Trong cách tiếp cận này, trước tiên, chúng tôi tính toán số tiền tố của 1 hiện tại cho mỗi bit. Bây giờ khi chúng tôi có được số lượng này, chúng tôi đã giải quyết được vấn đề lớn nhất của mình đó là duyệt các truy vấn. Hiện tại, chúng tôi sẽ không đi qua từng phạm vi. Vì vậy, chúng tôi có thể tính toán điều đó thông qua mảng tiền tố của chúng tôi ngay bây giờ. Logic chính của chúng tôi là chúng tôi tính toán số lần đặt lại và đặt các bit trong phạm vi khi chúng tôi gặp vị trí mà số bit đặt nhiều hơn số bit đặt lại. Do đó, chúng tôi đặt lại bit đó trong x của chúng tôi ngay bây giờ vì chúng tôi đã khởi tạo x với 2 ^ 31 - 1 để tất cả các bit của nó sẽ được đặt và chúng tôi tìm ra câu trả lời của mình bằng cách chuyển đổi các bit trong x.

Kết luận

Trong hướng dẫn này, chúng tôi giải quyết một vấn đề để tìm số có tổng XOR với một phạm vi mảng nhất định là lớn nhất. Chúng tôi cũng đã học chương trình C ++ cho vấn đề này và cách tiếp cận hoàn chỉnh (Bình thường) mà chúng tôi đã giải quyết vấn đề này. Chúng ta có thể viết cùng một chương trình bằng các ngôn ngữ khác như C, java, python và các ngôn ngữ khác. Chúng tôi hy vọng bạn thấy hướng dẫn này hữu ích.