Advertisement
_rashed

SPOJ BRCKTS2

Jan 30th, 2023
637
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #define ll long long
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. /*
  6. Ordered set usage:
  7. order_of_key (k) : Number of items strictly smaller than k.
  8. find_by_order(k) : K-th element in a set (counting from zero).
  9. */
  10.  
  11. #include <ext/pb_ds/assoc_container.hpp>
  12. #include <ext/pb_ds/tree_policy.hpp>
  13. using namespace __gnu_pbds;
  14. #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
  15.  
  16. const int OO = 1e9;
  17. const double EPS = 1e-9;
  18.  
  19. int c[350000];
  20.  
  21. pair<pair<ll,ll>,ll> solve(int s, int e) {
  22.     if(s+1 == e) {
  23.         //cout << "at s = " << s << " e = " << e << " ret is " << 1 << " " << 1 << " " << 1 << "\n";
  24.         return {{1,1},1};
  25.     }
  26.     ll h = 1;
  27.     ll w = 2;
  28.     ll area = 0;
  29.     for(int i = s+1; i < e; i = c[i]+1) {
  30.         pair<pair<ll,ll>,ll> ret = solve(i,c[i]);
  31.         h = max(h,ret.first.first+1);
  32.         w += ret.first.second;
  33.         if(i > s+1) {
  34.             w++;
  35.         }
  36.         area += ret.second;
  37.     }
  38.     //cout << "at s = " << s << " e = " << e << " ret is " << h << " " << w << " " << h*w-area << "\n";
  39.     return {{h,w},h*w-area};
  40. }
  41.  
  42. int main()
  43. {
  44.     ios_base::sync_with_stdio(NULL);
  45.     cin.tie(0);
  46.  
  47.     int t;
  48.     cin >> t;
  49.     while(t--) {
  50.         stack<int> stk;
  51.         string s;
  52.         cin >> s;
  53.         for(int i = 0; i < s.size(); i++) {
  54.             if(s[i] == ')') {
  55.                 c[stk.top()] = i;
  56.                 stk.pop();
  57.             }
  58.             else {
  59.                 stk.push(i);
  60.             }
  61.         }
  62.         ll ans = 0;
  63.         for(int i = 0; i < s.size(); i = c[i]+1) {
  64.             ans += solve(i,c[i]).second;
  65.             //cout << "ans is " << ans << "\n";
  66.         }
  67.         cout << ans << "\n";
  68.     }
  69.     return 0;
  70. }
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement