একটি নন-এম্পটি সংখ্যা অ্যারে 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 := headi = 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 := 0i = 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 nodei = 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