fork download
  1. // Author: 4uckd3v - Nguyen Cao Duc
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const int MAX_N = 1e3;
  8. const int MOD = 1e9 + 7;
  9. const string br = "([{)}]";
  10. const ll INF = 2e18;
  11.  
  12. int n, k;
  13. ll kth;
  14. string st;
  15. ll dp[MAX_N + 5][MAX_N + 5][2];
  16.  
  17. bool open(char c) {
  18. return c == '(' || c == '[' || c == '{';
  19. };
  20.  
  21. bool matchBracket(char o, char c) {
  22. return (o == '(' && c == ')') || (o == '[' && c == ']') || (o == '{' && c == '}');
  23. };
  24.  
  25. ll DP(int idx, int diff, bool ok) {
  26. if (idx > n) return (diff == 0 && ok);
  27. if (dp[idx][diff][ok] != -1) return dp[idx][diff][ok];
  28.  
  29. ll &ret = dp[idx][diff][ok] = 0;
  30. if (diff > 0) ret += DP(idx + 1, diff - 1, ok);
  31. if (diff < k) ret += DP(idx + 1, diff + 1, ok || (diff + 1) == k) * 3;
  32.  
  33. ret = min(ret, INF);
  34.  
  35. return ret;
  36. };
  37.  
  38. ll getRank(const string &st) {
  39. int diff = 0;
  40. bool ok = false;
  41. ll rank = 1;
  42.  
  43. stack<char> match;
  44. for (int i = 1; i <= n; i++) {
  45. for (char ch : br) {
  46. if (ch == st[i]) break;
  47. if (diff < k && open(ch)) rank += DP(i + 1, diff + 1, ok || (diff + 1) == k);
  48. if (diff > 0 && !open(ch)) {
  49. if (!match.empty() && matchBracket(match.top(), ch))
  50. rank += DP(i + 1, diff - 1, ok);
  51. }
  52. };
  53.  
  54. if (open(st[i])) {
  55. match.push(st[i]);
  56. diff++;
  57. ok |= diff == k;
  58. } else {
  59. match.pop();
  60. diff--;
  61. };
  62. };
  63.  
  64. return rank;
  65. };
  66.  
  67. string getKth(ll kth) {
  68. int diff = 0;
  69. bool ok = false;
  70. string ret;
  71. stack<char> match;
  72.  
  73. for (int i = 1; i <= n; i++) {
  74. ll cur = 0;
  75. for (char ch : br) {
  76. if (diff < k && open(ch)) {
  77. if (cur + DP(i + 1, diff + 1, ok || (diff + 1) == k) >= kth) {
  78. ret += ch;
  79. kth -= cur;
  80. diff++;
  81. ok |= diff == k;
  82. match.push(ch);
  83. break;
  84. } else
  85. cur += DP(i + 1, diff + 1, ok || (diff + 1) == k);
  86. };
  87. if (diff > 0 && !open(ch) && !match.empty() && matchBracket(match.top(), ch)) {
  88. if (cur + DP(i + 1, diff - 1, ok) >= kth) {
  89. ret += ch;
  90. kth -= cur;
  91. diff--;
  92. match.pop();
  93. break;
  94. } else
  95. cur += DP(i + 1, diff - 1, ok);
  96. };
  97. };
  98. };
  99.  
  100. return ret;
  101. };
  102.  
  103. int main() {
  104. ios_base::sync_with_stdio(0);
  105. cin.tie(0);
  106. if (fopen("BRCNT1.INP", "r")) {
  107. freopen("BRCNT1.INP", "r", stdin);
  108. freopen("BRCNT1.OUT", "w", stdout);
  109. };
  110.  
  111. cin >> n >> k >> st >> kth;
  112. st = " " + st;
  113.  
  114. memset(dp, -1, sizeof dp);
  115.  
  116. DP(1, 0, 0);
  117. cout << getRank(st) << '\n';
  118. cout << getKth(kth) << '\n';
  119. };
Success #stdin #stdout 0.01s 19404KB
stdin
Standard input is empty
stdout
1