Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में पूर्णांकों की धारा में दिए गए पूर्णांक का अधिकतम XOR ज्ञात कीजिए


इस समस्या में, हमें Q प्रश्न दिए गए हैं जिनमें से प्रत्येक निम्न प्रकार में से एक है,

टाइप 1 - अपनी डेटा संरचना में मान i के साथ तत्व जोड़ने के लिए प्रविष्टि (1, i)।

टाइप 2 - FindXOR (2, i), तत्व i के साथ डेटा संरचना के सभी तत्वों के XOR को खोजने के लिए।

डेटा संरचना में प्रारंभ में केवल 1 तत्व होना चाहिए जो कि 0 होगा।

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट

Queries: (1, 9), (1, 3), (1, 7), (2, 8), (1, 5), (2, 12)

आउटपुट

15 15

स्पष्टीकरण

Solving each query,
(1, 9) => data structure => {9}
(1, 3) => data structure => {9, 3}
(1, 7) => data structure => {9, 3, 7}
(2, 8) => maximum XOR(_, 8) = 15, XOR(7, 8)
(1, 5) => data structure => {9, 3, 7, 5}
(2, 12) => maximum XOR(_, 12) = 15, XOR(3, 12)

समाधान दृष्टिकोण

समस्या का समाधान ट्राई डेटा संरचना का उपयोग करके पाया जा सकता है, जो एक विशेष प्रकार का खोज ट्री है। हम एक ट्री का उपयोग करेंगे जिसमें प्रत्येक नोड में किसी संख्या के बाइनरी मानों को संग्रहीत करने के लिए दो चाइल्ड नोड होते हैं। इसके बाद हम टाइप 1 की प्रत्येक क्वेरी के लिए संख्या के बाइनरी मान को ट्री में जोड़ देंगे। टाइप 2 की एक क्वेरी के लिए, हम दिए गए मान के लिए ट्राई में पथ पाएंगे और फिर लेवल काउंट परिणाम देगा।

ट्राइ विज़िट पर अधिक जानकारी के लिए, डेटा संरचना आज़माएं।

हमारे समाधान की कार्यप्रणाली को दर्शाने वाला कार्यक्रम,

उदाहरण

#include<bits/stdc++.h>
using namespace std;
struct Trie {
   Trie* children[2];
   bool isLeaf;
};
bool check(int N, int i) {
   return (bool)(N & (1<<i));
}
Trie* newNode() {
   Trie* temp = new Trie;
   temp->isLeaf = false;
   temp->children[0] = NULL;
   temp->children[1] = NULL;
   return temp;
}
void insertVal(Trie* root, int x) {
   Trie* val = root;
   for (int i = 31; i >= 0; i--) {
      int f = check(x, i);
      if (! val->children[f])
         val->children[f] = newNode();
         val = val->children[f];
   }
   val->isLeaf = true;
}
int solveQueryType2(Trie *root, int x){
   Trie* val = root;
   int ans = 0;
   for (int i = 31; i >= 0; i--) {
      int f = check(x, i);
      if ((val->children[f ^ 1])){
         ans = ans + (1 << i);
         val = val->children[f ^ 1];
      }
      else
      val = val->children[f];
   }
   return ans;
}
void solveQueryType1(Trie *root, int x){
   insertVal(root, x);
}
int main(){
   int Q = 6;
   int query[Q][2] = {{1, 9}, {1, 3}, {1, 7}, {2, 8}, {1, 5}, {2, 12}};
   Trie* root = newNode();
   for(int i = 0; i < Q; i++){
      if(query[i][0] == 1 ){
         solveQueryType1(root, query[i][1]);
         cout<<"Value inserted to the data Structure. value =
         "<<query[i][1]<<endl;
      }
      if(query[i][0] == 2){
         cout<<"The maximum XOR with "<<query[i][1]<<" is
         "<<solveQueryType2(root, query[i][1])<<endl;
      }
   }
   return 0;
}

आउटपुट

Value inserted to the data Structure. value = 9
Value inserted to the data Structure. value = 3
Value inserted to the data Structure. value = 7
The maximum XOR with 8 is 15
Value inserted to the data Structure. value = 5
The maximum XOR with 12 is 15

  1. C++ में दी गई संख्या के अंकों का उपयोग करके बनाई जा सकने वाली अधिकतम संख्या ज्ञात कीजिए

    मान लीजिए कि हमारे पास कई n अंक हैं। हमें वह अधिकतम संख्या ज्ञात करनी है जो उस संख्या के अंकों के सभी अंकों का प्रयोग करके प्राप्त की जा सकती है। अतः यदि संख्या 339625 कहें तो अधिकतम संख्या 965332 हो सकती है। समस्या से, हम देख सकते हैं कि हम अंकों को गैर-बढ़ते क्रम में आसानी से सॉर्ट कर सकते हैं, फ

  1. C++ में दिए गए मान के निकटतम तत्वों को खोजें

    विचार करें कि हमारे पास कुछ तत्वों के साथ एक सरणी ए है। हमारे पास दो अन्य मान X और k हैं। हमारा कार्य सरणी A से X के निकटतम तत्वों की k संख्या ज्ञात करना है। यदि तत्व X सरणी में मौजूद है, तो यह आउटपुट में नहीं दिखाया जाएगा। अगर ए =[12, 16, 22, 30, 35, 39, 42, 45, 48, 50, 53, 55, 56] और एक्स =35, के

  1. C++ में दिए गए उत्पाद के साथ N पूर्णांकों की अधिकतम GCD

    मान लीजिए कि हम दो पूर्णांक N और P हैं। P, N अज्ञात पूर्णांकों का गुणनफल है। हमें उन पूर्णांकों का अधिकतम संभव GCD ज्ञात करना है। मान लीजिए एन =3, और पी =24, तो अलग-अलग समूह होंगे जैसे {1, 1, 24}, {1, 2, 12}, {1, 3, 8}, {1, 4, 6}, {2 , 2, 6}, {2, 3, 4}। जीसीडी हैं:1, 1, 1, 1, 2, 1. तो उत्तर यहां 2 ह