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

C++-এ অ্যারেতে দুটি সংখ্যার সর্বোচ্চ XOR


একটি নন-এম্পটি সংখ্যা অ্যারে a0, a1, ..., an-1 দেওয়া আছে, যেখানে 0 <= ai < 2^31। ai XOR aj-র সর্বোচ্চ ফলাফল বের করতে হবে, যেখানে 0 <= i, j < n। উদাহরণ: [3,10,5,25,2,8] হলে আউটপুট ২৮, কারণ 5 XOR 25 = 28।

সমাধানের ধাপগুলো:

  • insertNode() বানান যা val আর head নেবে:
    • curr := head
    • i = 31 থেকে 0 পর্যন্ত:
      • bit := (val >> i) & 1
      • যদি curr.child[bit] null হয়, curr.child[bit] := new node
      • curr := curr.child[bit]
  • find() মেথড বানান যা val আর head নেবে:
    • curr := head, ans := 0
    • i = 31 থেকে 0 পর্যন্ত:
      • bit := (val >> i) & 1
      • যদি curr.child[!bit] থাকে, ans |= (1 << i), curr := curr.child[!bit]
      • অন্যথায় curr := curr.child[bit]
    • ans ফেরত দিন।
  • মূল মেথড থেকে:
    • ans := 0, n := nums.size()
    • head := new node
    • i = 0 থেকে n-1: insertNode(nums[i], head)
    • i = 0 থেকে n-1: ans := max(ans, find(nums[i], head))
    • ans ফেরত দিন।

উদাহরণ (C++)

#include <bits/stdc++.h> using namespace std; struct Node{    Node* child[2];    Node(){       child[1] = child[0] = NULL;    } }; class Solution {    public:    void insertNode(int val, Node* head){       Node* curr = head;       for(int i = 31; i>= 0; i--){          int bit = (val >> i) & 1;          if(!curr->child[bit]){             curr->child[bit] = new Node();          }          curr = curr->child[bit];       }    }    int find(int val, Node* head){       Node* curr = head;       int ans = 0;       for(int i = 31; i>= 0; i--){          int bit = (val >> i) & 1;          if(curr->child[!bit]){             ans |= (1 << i);             curr = curr->child[!bit];          } else {             curr = curr->child[bit];          }       }       return ans;    }    int findMaximumXOR(vector<int>& nums) {       int ans = 0;       int n = nums.size();       Node* head = new Node();       for(int i = 0; i < n; i++){          insertNode(nums[i], head);       }       for(int i = 0; i < n; i++){          ans = max(ans, find(nums[i], head));       }       return ans;    } }; main(){    vector<int> v = {3,10,5,25,2,8};    Solution ob;    cout << (ob.findMaximumXOR(v)); }

ইনপুট

[3,10,5,25,2,8]

আউটপুট

28

  1. অ্যারে থেকে দুটি সংখ্যা বানিয়ে ন্যূনতম যোগফল (C++)

  2. অ্যারে (বিগুণ সংখ্যা) এর GCD বের করা (C++)

  3. C++-এ দুইটির অধিক সংখ্যার GCD (GCD of Array/Multiple Numbers)

  4. C++ প্রোগ্রাম: দুটি সংখ্যা সোয়াপ (Swap) করা