Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

XOR ของโหนดทั้งหมดในแผนผังย่อยของโหนดที่กำหนดใน C++


ในปัญหานี้ เราจะได้รับ n tree และมีการสอบถามบางอย่างที่เป็นโหนดของ tree งานของเราคือพิมพ์ XOR ของโหนดทั้งหมดของแผนผังย่อยที่สร้างโดยโหนดที่กำหนด

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

XOR ของโหนดทั้งหมดในแผนผังย่อยของโหนดที่กำหนดใน C++

สอบถาม − {1, 6, 5}

ผลผลิต

0
0
5

คำอธิบาย

1^6^3^2^4^7^5
6^2^4
5

เพื่อแก้ปัญหานี้ เราจะคำนวณ xor ของโหนดทั้งหมดของ sub-tree โดยการสำรวจต้นไม้หนึ่งครั้งและเก็บไว้ ตอนนี้ เราจะคำนวณ xor ของโหนดทั้งหมดของ sub-tree ถ้าโหนดย่อยแล้วคำนวณสำหรับ sub-tree ที่กำหนดทั้งหมด การจัดเก็บผลลัพธ์ช่วยประหยัดเวลา

ตัวอย่าง

โปรแกรมแสดงการใช้งานโซลูชันของเรา

#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > graph;
vector<int> values, xorValues;
int computeXorValues(int i, int prev){
   int x = values[i];
   for (int j = 0; j < graph[i].size(); j++)
      if (graph[i][j] != prev) {
         x ^= computeXorValues(graph[i][j], i);
      }
      xorValues[i] = x;
      return x;
}
int solveQuerry(int u){
   return xorValues[u];
}
int main(){
   int n = 7;
   graph.resize(n);
   xorValues.resize(n);
   graph[0].push_back(1);
   graph[0].push_back(2);
   graph[1].push_back(3);
   graph[1].push_back(4);
   graph[2].push_back(5);
   graph[2].push_back(6);
   values.push_back(1);
   values.push_back(2);
   values.push_back(3);
   values.push_back(4);
   values.push_back(5);
   values.push_back(6);
   values.push_back(7);
   computeXorValues(0, -1);
   int queries[] = { 0, 2, 4, 6 };
   int q = sizeof(queries) / sizeof(queries[0]);
   for (int i = 0; i < q; i++)
      cout<<"Solution for querry "<<(i+1)<<": "<<solveQuerry(queries[i])<<endl;
   return 0;
}

ผลลัพธ์

Solution for querry 1: 0
Solution for querry 2: 2
Solution for querry 3: 5
Solution for querry 4: 7