RainX_69

1938. Maximum Genetic Difference Query

Jan 3rd, 2023
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | Source Code | 0 0
  1. https://leetcode.com/problems/maximum-genetic-difference-query/
  2.  
  3.  
  4. struct TrieNode{
  5.     TrieNode* children[2];
  6.     int freq;
  7.     TrieNode(){
  8.         this->children[0]=nullptr;
  9.         this->children[1]=nullptr;
  10.         freq=0;
  11.     }
  12. };
  13.  
  14. class Solution {
  15. private:
  16.     vector<vector<int>> adj;
  17.     TrieNode* root;
  18.     vector<int> res;
  19.     unordered_map<int,vector<int>> mpp;
  20. public:
  21.     void increment_decrement(int num, int decide){
  22.         TrieNode* pCrawl=root;
  23.         for(int i=31;i>=0;i--){
  24.             int state=(num >> i) & 1;
  25.             if(pCrawl->children[state]==nullptr){
  26.                 pCrawl->children[state]=new TrieNode();
  27.             }
  28.             pCrawl=pCrawl->children[state];
  29.             pCrawl->freq+=decide;
  30.         }
  31.         pCrawl->freq+=decide;
  32.     }
  33.    
  34.     int max_XOR(int num){
  35.         int res=0;
  36.         TrieNode* pCrawl=root;
  37.         for(int i=31;i>=0;i--){
  38.             int state=(num >> i) & 1;
  39.             if(pCrawl->children[state ^ 1]!=nullptr && pCrawl->children[state ^ 1]->freq>0){
  40.                 pCrawl=pCrawl->children[state ^ 1];
  41.                 res=res | (1 << i);
  42.             }
  43.             else if(pCrawl->children[state]->freq>0){
  44.                 pCrawl=pCrawl->children[state];
  45.             }
  46.             else{
  47.                 return 0;
  48.             }
  49.         }
  50.         return res;
  51.     }
  52.    
  53.     void dfs(int node, vector<vector<int>> &queries){
  54.         increment_decrement(node,1);
  55.         if(mpp.find(node)!=mpp.end()){
  56.             for(auto index: mpp[node]){
  57.                 int val=queries[index][1];
  58.                 int ans=max_XOR(val);
  59.                 res[index]=ans;
  60.             }
  61.             mpp.erase(node);
  62.         }
  63.         for(auto nei: adj[node]){
  64.             dfs(nei,queries);
  65.         }
  66.         increment_decrement(node,-1);
  67.     }
  68.    
  69.     vector<int> maxGeneticDifference(vector<int>& parent, vector<vector<int>>& queries){
  70.         root=new TrieNode();
  71.         int Q=queries.size();
  72.         res.resize(Q);
  73.         for(int i=0;i<Q;i++){
  74.             mpp[queries[i][0]].push_back(i);
  75.         }
  76.         int root;
  77.         adj.resize(parent.size());
  78.         for(int i=0;i<parent.size();i++){
  79.             if(parent[i]==-1){
  80.                 root=i;
  81.                 continue;
  82.             }
  83.             adj[parent[i]].push_back(i);
  84.         }
  85.         dfs(root,queries);
  86.         return res;
  87.     }
  88. };
Advertisement
Add Comment
Please, Sign In to add comment