Advertisement
ke_timofeeva7

номер по псп два вида скобок

Nov 2nd, 2021
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <string>
  4. #include <sstream>
  5. #include <vector>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <memory.h>
  9. #include <stdio.h>
  10. #include <stack>
  11. #include <deque>
  12. #include <queue>
  13. #include <set>
  14. #include <iterator>
  15. #include <map>
  16. #include <iomanip>
  17. #include <unordered_set>
  18. #define int long long
  19. #define pb push_back
  20. #define double long double
  21. #define endl "\n"
  22. #define un unsigned
  23. #define INF 1000000009
  24. #define pii pair<int, int>
  25. #define all(v) v.begin(), v.end()
  26. using namespace std;
  27.  
  28. const int N = 1000000;
  29. const int MOD = 1e9 + 7;
  30.  
  31. signed main()
  32. {
  33.     ios_base::sync_with_stdio();
  34.     cin.tie(0);
  35.     cout.tie(0);
  36.  
  37.     freopen("brackets2num2.in", "r", stdin);
  38.     freopen("brackets2num2.out", "w", stdout);
  39.  
  40.     string s;
  41.     cin >> s;
  42.  
  43.     int n = s.size() / 2;
  44.  
  45.     vector<vector<int>> dp(2 * n + 5, vector<int>(2 * n + 5, 0));
  46.  
  47.     dp[0][0] = 1;
  48.  
  49.     for (int i = 1; i <= 2 * n; i++)
  50.     {
  51.         for (int bal = 0; bal <= 2 * n; bal++)
  52.         {
  53.             if (bal > 0)
  54.             {
  55.                 dp[i][bal] = dp[i - 1][bal - 1];
  56.             }
  57.  
  58.             if (bal < n)
  59.             {
  60.                 dp[i][bal] += dp[i - 1][bal + 1];
  61.             }
  62.         }
  63.     }
  64.  
  65.     int ans = 0;
  66.     int bal = 0;
  67.  
  68.     int open_k = 0, open_sq = 0;
  69.  
  70.     vector<pii> kr;
  71.  
  72.     for (int i = 0; i < s.size(); i++)
  73.     {
  74.         if (s[i] == '(')
  75.         {
  76.             bal++;
  77.             open_k++;
  78.             kr.push_back({ i,0 });
  79.         }        
  80.         else if (s[i] == ')')
  81.         {
  82.             ans += dp[2 * n - i - 1][bal + 1] * (1 << ((2 * n - i - 1 - bal - 1) / 2));
  83.  
  84.             bal--;
  85.             open_k--;
  86.             kr.pop_back();
  87.         }
  88.         else if (s[i] == '[')
  89.         {
  90.             ans += dp[2 * n - i - 1][bal + 1] * (1 << ((2 * n - i - 1 - bal - 1) / 2));
  91.  
  92.             if (bal > 0 && open_k > 0 && kr.back().second == 0 && s[i - 1] != '[')
  93.             {
  94.                 ans += dp[2 * n - i - 1][bal - 1] * (1 << ((2 * n - i - 1 - bal + 1) / 2));
  95.             }
  96.  
  97.             for (int p = 0; p < kr.size(); p++)
  98.             {
  99.                 kr[p].second++;
  100.             }
  101.  
  102.             bal++;
  103.             open_sq++;
  104.         }        
  105.         else
  106.         {
  107.             if (bal > 0 && open_k > 0 && open_sq == 0)
  108.             {
  109.                 ans += dp[2 * n - i - 1][bal - 1] * (1 << ((2 * n - i - 1 - bal + 1) / 2));
  110.             }
  111.  
  112.             ans += 2 * dp[2 * n - i - 1][bal + 1] * (1 << ((2 * n - i - 1 - bal - 1) / 2));
  113.  
  114.             for (int p = 0; p < kr.size(); p++)
  115.             {
  116.                 kr[p].second--;
  117.             }
  118.  
  119.             bal--;
  120.             open_sq--;
  121.         }
  122.     }
  123.  
  124.     cout << ans;
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement