Guest User

Untitled

a guest
Jun 13th, 2022
460
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. mt19937 mt (time (NULL));
  5. int get_random() {
  6.     return uniform_int_distribution<int> (0, 2e9) (mt);
  7. }
  8.  
  9. struct Treap {
  10.     int treap_size = 1, priority = get_random();
  11.     char value;
  12.     Treap *l = NULL, *r = NULL;
  13.     Treap() {}
  14.     Treap (int value) : value (value) {}
  15. };
  16.  
  17. int treap_size (Treap *treap) {
  18.     return treap == NULL ? 0 : treap->treap_size;
  19. }
  20.  
  21. void push_up (Treap *treap) {
  22.     treap->treap_size = treap_size (treap->l) + treap_size (treap->r) + 1;
  23. }
  24.  
  25. Treap *Merge (Treap *a, Treap *b) {
  26.     if (a == NULL)
  27.         return b;
  28.     if (b == NULL)
  29.         return a;
  30.     if (a->priority < b->priority) {
  31.         b->l = Merge (a, b->l);
  32.         push_up (b);
  33.         return b;
  34.     } else {
  35.         a->r = Merge (a->r, b);
  36.         push_up (a);
  37.         return a;
  38.     }
  39. }
  40.  
  41. void Split (Treap *treap, Treap *&a, Treap *&b, int k) {
  42.     if (treap == NULL) {
  43.         a = b = NULL;
  44.         return;
  45.     }
  46.     if (treap_size (treap->l) >= k) {
  47.         b = treap;
  48.         Split (treap->l, a, b->l, k);
  49.         push_up (b);
  50.     } else {
  51.         a = treap;
  52.         Split (treap->r, a->r, b, k - treap_size (treap->l) - 1);
  53.         push_up (a);
  54.     }
  55. }
  56.  
  57. string result;
  58.  
  59. void dfs (Treap *t) {
  60.     if (t == NULL) return;
  61.     dfs (t->l);
  62.     result += t->value;
  63.     dfs (t->r);
  64. }
  65.  
  66. string get_decode (string e, string s) {
  67.     Treap *t = NULL;
  68.     int cnt = 0;
  69.     for (int i = e.size() - 1; i >= 0; i--) {
  70.         if (e[i] == '0') {
  71.             t = Merge (new Treap (s[i]), t);
  72.         } else {
  73.             t = Merge (t, new Treap (s[i]));
  74.             cnt++;
  75.         }
  76.     }
  77.     if (cnt % 2 == 1) {
  78.         int need = s.size() / 2;
  79.         if (s.size() % 2 == 1) {
  80.             Treap *t1, *t2;
  81.             Split (t, t1, t, need);
  82.             Split (t, t, t2, 1);
  83.             t = Merge (Merge (t2, t), t1);
  84.         } else {
  85.             Treap *t1;
  86.             Split (t, t1, t, need);
  87.             t = Merge (t, t1);
  88.         }
  89.     }
  90.     result.clear();
  91.     dfs (t);
  92.     return result;
  93. }
  94.  
  95. int main() {
  96.     int m, n;
  97.     cin >> m >> n;
  98.     string s, e[m];
  99.     for (int i = 0; i < m; i++) {
  100.         cin >> e[i];
  101.     }
  102.     cin >> s;
  103.     for (int i = m - 1; i >= 0; i--) {
  104.         s = get_decode (e[i], s);
  105.     }
  106.     cout << s << endl;
  107. }
  108.  
Advertisement
Add Comment
Please, Sign In to add comment