Thursday, March 28, 2019

[Codeforces] E. Almost Regular Bracket Sequence

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : E. Almost Regular Bracket Sequence
Source            : Codeforces
Category          : Data Structure
Algorithm         : Segment Tree
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 1e6 + 5;  
  6.   
  7. struct segmentTree  
  8. {  
  9.       int open, close;  
  10.       segmentTree(int open = 0, int close = 0) : open(open), close(close) {}  
  11.   
  12.       void assignLeaf(char bracket)  
  13.       {  
  14.             open = close = 0;  
  15.             if (bracket == '(') ++open;  
  16.             else ++close;  
  17.       }  
  18.       void marge(const segmentTree &lchild, const segmentTree &rchild)  
  19.       {  
  20.             int mini = min(lchild.open, rchild.close);  
  21.             open = lchild.open + rchild.open - mini;  
  22.             close = lchild.close + rchild.close - mini;  
  23.       }  
  24.       bool isRegular()  
  25.       {  
  26.             return (open == 0 && close == 0);  
  27.       }  
  28. } Tree[maxn*4];  
  29.   
  30. int n;  
  31. string s;  
  32.   
  33. void build(int node = 1, int a = 1, int b = n)  
  34. {  
  35.       if (a == b)  
  36.       {  
  37.             Tree[node].assignLeaf(s[a-1]);  
  38.             return;  
  39.       }  
  40.       int lft = node << 1;  
  41.       int rgt = lft | 1;  
  42.       int mid = (a + b) >> 1;  
  43.       build(lft, a, mid);  
  44.       build(rgt, mid+1, b);  
  45.       Tree[node].marge(Tree[lft], Tree[rgt]);  
  46. }  
  47.   
  48. void update(int node, int a, int b, int pos, char bracket)  
  49. {  
  50.       if (a > pos or b < pos) return;  
  51.       if (a >= pos && b <= pos)  
  52.       {  
  53.             Tree[node].assignLeaf(bracket);  
  54.             return;  
  55.       }  
  56.       int lft = node << 1;  
  57.       int rgt = lft | 1;  
  58.       int mid = (a + b) >> 1;  
  59.       update(lft, a, mid, pos, bracket);  
  60.       update(rgt, mid+1, b, pos, bracket);  
  61.       Tree[node].marge(Tree[lft], Tree[rgt]);  
  62. }  
  63.   
  64. int main()  
  65. {  
  66.       ios_base::sync_with_stdio(false);  
  67.       cin.tie(nullptr);  
  68.       cout << fixed << setprecision(15);  
  69.       #ifndef ONLINE_JUDGE  
  70.             freopen("in.txt""r", stdin);  
  71.       #endif // ONLINE_JUDGE  
  72.   
  73.       cin >> n >> s;  
  74.       build();  
  75.       int cnt = 0;  
  76.       for (int i = 1; i <= n; i++)  
  77.       {  
  78.             char bracket = s[i-1];  
  79.             if (bracket == '(')  
  80.             {  
  81.                   update(1, 1, n, i, ')');  
  82.                   if (Tree[1].isRegular()) ++cnt;  
  83.                   update(1, 1, n, i, '(');  
  84.             }  
  85.             else  
  86.             {  
  87.                   update(1, 1, n, i, '(');  
  88.                   if (Tree[1].isRegular()) ++cnt;  
  89.                   update(1, 1, n, i, ')');  
  90.             }  
  91.       }  
  92.       cout << cnt;  
  93. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.