fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. const int N = 1e5 + 5;
  12.  
  13. int n;
  14. string s;
  15. int open_pos[N]; // open_pos[i] = Vị trí của ngoặc mở tương ứng với ngoặc đóng s[i]
  16. int dp[N]; // dp[i] = Số lượng xâu con liên tiếp kết thúc tại i thoả mãn là dãy ngoặc đúng
  17.  
  18. // c có phải ngoặc mở
  19. bool is_open(char c) {
  20. return (c == '(' || c == '[' || c == '{' || c == '<');
  21. }
  22.  
  23. // ngoặc đóng tương ứng với ngoặc mở c
  24. char close(char c) {
  25. if (c == '(') return ')';
  26. if (c == '[') return ']';
  27. if (c == '{') return '}';
  28. return '>';
  29. }
  30.  
  31. int main() {
  32. ios::sync_with_stdio(false);
  33. cin.tie(nullptr);
  34. // freopen("tbrackets.inp", "r", stdin);
  35. // freopen("tbrackets.out", "w", stdout);
  36. cin >> s;
  37. n = s.size();
  38. s = ' ' + s;
  39.  
  40. memset(open_pos, -1, sizeof open_pos);
  41.  
  42. vector<int> st;
  43. for (int i = 1; i <= n; i++) {
  44. if (is_open(s[i])) {
  45. st.push_back(i);
  46. }
  47. else {
  48. if (!st.empty()) {
  49. if (s[i] == close(s[st.back()])) {
  50. open_pos[i] = st.back();
  51. st.pop_back();
  52. }
  53. else {
  54. st.clear();
  55. }
  56. }
  57. }
  58. }
  59.  
  60. for (int i = 1; i <= n; i++) {
  61. if (open_pos[i] == -1) continue;
  62. dp[i] = 1 + dp[open_pos[i] - 1];
  63. }
  64.  
  65. ll ans = 0;
  66. for (int i = 1; i <= n; i++) {
  67. ans += dp[i];
  68. }
  69.  
  70. cout << ans << '\n';
  71. }
Success #stdin #stdout 0.01s 5288KB
stdin
[]{()}
stdout
4