Advertisement
coloriot

HA_57

Jun 29th, 2025
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.86 KB | None | 0 0
  1. /*
  2.  * Вход:
  3.  *   n                        — количество вершин (0 … n-1)
  4.  *   затем n строк:           — описание каждой вершины
  5.  *     <буква>  <left> <right>
  6.  *       буква  – символ 'A' … 'Z' в самой вершине
  7.  *       left   – индекс левого ребёнка или −1
  8.  *       right  – индекс правого ребёнка или −1
  9.  *
  10.  * Корень – та вершина, которая нигде не встречается как чайлд.
  11.  */
  12.  
  13. /*
  14. 7
  15. A 1 2
  16. B 3 4
  17. C 5 6
  18. D -1 -1
  19. E -1 -1
  20. F -1 -1
  21. E -1 -1
  22. */
  23.  
  24. #include <bits/stdc++.h>
  25. // Так вызываются все стандартные библиотеки
  26. using namespace std;
  27.  
  28. struct Node {
  29.     char c;     // буква
  30.     int  left;  // индекс левого чайлда или -1
  31.     int  right; // индекс правого чайлда или -1
  32. };
  33.  
  34. // информация, которую храним в хэше для каждой маски
  35. struct Info {
  36.     int idx;   // вершина
  37.     int size;  // размер поддерева
  38. };
  39.  
  40. vector<Node> tree;                       // сами вершины
  41. unordered_map<uint32_t, Info> seenMask;  // mask → лучшая вершина
  42. pair<int,int> firstPair{-1,-1};          // ответ на «лёгкую» версию
  43. pair<int,int> bestPair{-1,-1};           // ответ на «сложную» версию
  44. int bestSum = -1;                        // максимум size(u)+size(v)
  45.  
  46. /* DFS возвращает:
  47.  *   mask  — 26-битная маска букв поддерева
  48.  *   size  — количество вершин поддерева
  49.  */
  50. pair<uint32_t,int> dfs(int v)
  51. {
  52.     if (v == -1) return {0u, 0};
  53.  
  54.     auto [mL, sL] = dfs(tree[v].left);
  55.     auto [mR, sR] = dfs(tree[v].right);
  56.  
  57.     uint32_t myMask = mL | mR | (1u << (tree[v].c - 'A'));
  58.     int      mySize = sL + sR + 1;
  59.  
  60.     auto it = seenMask.find(myMask);
  61.  
  62.     // первая пара дублей → ответ «лёгкой» задачи
  63.     if (it != seenMask.end() && firstPair.first == -1)
  64.         firstPair = {it->second.idx, v};
  65.  
  66.     // обновляем максимум для «сложной» версии
  67.     if (it != seenMask.end()) {
  68.         int curSum = it->second.size + mySize;
  69.         if (curSum > bestSum) {
  70.             bestSum = curSum;
  71.             bestPair = {it->second.idx, v};
  72.         }
  73.         // в таблице оставляем вершину с бОльшим поддеревом —
  74.         // это для следующих сравнений
  75.         if (mySize > it->second.size)
  76.             it->second = {v, mySize};
  77.     } else {
  78.         seenMask.emplace(myMask, Info{v, mySize});
  79.     }
  80.  
  81.     return {myMask, mySize};
  82. }
  83.  
  84. int main()
  85. {
  86.     ios::sync_with_stdio(false);
  87.     cin.tie(nullptr);
  88.  
  89.     int n;
  90.     if (!(cin >> n)) return 0;
  91.  
  92.     tree.resize(n);
  93.     for (int i = 0; i < n; ++i) {
  94.         char ch; int l, r;
  95.         cin >> ch >> l >> r;
  96.         tree[i] = {ch, l, r};
  97.     }
  98.  
  99.     /* определяем корень: тот,
  100.     кто не является ничьим чайлдом */
  101.     vector<int> isChild(n, 0);
  102.     for (auto &v : tree) {
  103.         if (v.left  != -1) isChild[v.left]  = 1;
  104.         if (v.right != -1) isChild[v.right] = 1;
  105.     }
  106.     int root = find(isChild.begin(), isChild.end(), 0) - isChild.begin();
  107.     if (root == n) { cerr << "root not found\n"; return 0; }
  108.  
  109.     dfs(root);
  110.  
  111.     if (firstPair.first == -1)
  112.         cout << "No equivalent vertices\n";
  113.     else {
  114.         cout << "Easy version pair: "  << firstPair.first << ' ' << firstPair.second << '\n';
  115.         cout << "Hard version pair: "  << bestPair.first  << ' ' << bestPair.second
  116.              << " (sum = " << bestSum << ")\n";
  117.     }
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement