Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef long double ld;
  7. typedef unsigned int ui;
  8. typedef pair < ll, ll > pll;
  9. typedef pair < int, ll > pil;
  10. typedef pair < ll, int > pli;
  11. typedef pair < int, int > pii;
  12. typedef unsigned long long ull;
  13.  
  14. #define F first
  15. #define S second
  16. #define en end()
  17. #define bg begin()
  18. #define rev reverse
  19. #define mp make_pair
  20. #define pb push_back
  21. #define y1 y1234567890
  22. #define um unordered_map
  23. #define all(x) x.bg, x.en
  24. #define sqr(x) ((x) * (x))
  25. #define sz(x) (int)x.size()
  26.  
  27. const ll inf = (ll)1e18;
  28. const ll mod = (ll)1e9 + 7;
  29. const double pi = acos(-1.0);
  30. const double eps = (double)1e-9;
  31.  
  32. const int dx[] = {0, 0, 1, 0, -1};
  33. const int dy[] = {0, 1, 0, -1, 0};
  34.  
  35. const int N = 1001;
  36. const int M = 10001;
  37.  
  38. string s[N];
  39. bool u[N][M];
  40. vector < short > ans;
  41. short dp[N][M], pr[N][M];
  42. short n, len[N], bal[N], mbal[N], a[N];
  43.  
  44. inline bool cmp(int i, int j) {
  45. int bal1 = 0, mbal1 = 0;
  46. for (int k = 0; k < len[a[i]]; k++) {
  47. if (s[a[i]][k] == '(')
  48. bal1++;
  49. else
  50. bal1--;
  51. mbal1 = min(mbal1, bal1);
  52. }
  53. for (int k = 0; k < len[a[j]]; k++) {
  54. if (s[a[j]][k] == '(')
  55. bal1++;
  56. else
  57. bal1--;
  58. mbal1 = min(mbal1, bal1);
  59. }
  60. int bal2 = 0, mbal2 = 0;
  61. for (int k = 0; k < len[a[j]]; k++) {
  62. if (s[a[j]][k] == '(')
  63. bal2++;
  64. else
  65. bal2--;
  66. mbal2 = min(mbal2, bal2);
  67. }
  68. for (int k = 0; k < len[a[i]]; k++) {
  69. if (s[a[i]][k] == '(')
  70. bal2++;
  71. else
  72. bal2--;
  73. mbal2 = min(mbal2, bal2);
  74. }
  75. /*cout << i << " " << j << " " << s[a[i]] + s[a[j]] << " " << s[a[j]] + s[a[i]] << endl;
  76. cout << mbal1 << " " << mbal2 << " " << bal1 << " " << bal2 << endl << endl;*/
  77. if (mbal1 == mbal2)
  78. return mbal[a[i]] > mbal[a[j]];
  79. return mbal1 > mbal2;
  80. }
  81.  
  82. int main() {
  83. //freopen(".in", "r", stdin);
  84. //freopen(".out", "w", stdout);
  85.  
  86. cin.tie(NULL);
  87. cout.tie(NULL);
  88. ios_base::sync_with_stdio(false);
  89.  
  90. cin >> n;
  91.  
  92. for (int i = 1; i <= n; i++) {
  93. cin >> s[i];
  94. mbal[i] = M;
  95. len[i] = sz(s[i]);
  96. for (int j = 0; j < len[i]; j++) {
  97. if (s[i][j] == '(')
  98. bal[i]++;
  99. else
  100. bal[i]--;
  101. mbal[i] = min(mbal[i], bal[i]);
  102. }
  103. a[i] = i;
  104. }
  105.  
  106. //cout << endl;
  107.  
  108. sort(a + 1, a + 1 + n, &cmp);
  109.  
  110. /*for (int i = 1; i <= n; i++)
  111. cout << a[i] << " ";
  112. cout << endl;*/
  113.  
  114. memset(dp, -1, sizeof(dp));
  115.  
  116. for (int i = 0; i <= n; i++)
  117. for (int j = 0; j < M; j++)
  118. pr[i][j] = i;
  119.  
  120. dp[0][0] = 0;
  121.  
  122. for (int i = 1; i <= n; i++) {
  123. for (int j = 0; j < M; j++) {
  124. if (dp[i - 1][j] == -1)
  125. continue;
  126. if (j + mbal[a[i]] >= 0 && j + bal[a[i]] < M && dp[i - 1][j] + len[a[i]] > dp[i][j + bal[a[i]]]) {
  127. dp[i][j + bal[a[i]]] = dp[i - 1][j] + len[a[i]];
  128. if (u[i - 1][j])
  129. pr[i][j + bal[a[i]]] = i - 1;
  130. else
  131. pr[i][j + bal[a[i]]] = pr[i - 1][j];
  132. u[i][j + bal[a[i]]] = 1;
  133. }
  134. if (dp[i - 1][j] > dp[i][j]) {
  135. dp[i][j] = dp[i - 1][j];
  136. if (u[i - 1][j])
  137. pr[i][j] = i - 1;
  138. else
  139. pr[i][j] = pr[i - 1][j];
  140. u[i][j] = 0;
  141. }
  142. }
  143. }
  144.  
  145. int i = n, j = 0;
  146.  
  147. while (i) {
  148. int x, y;
  149. if (u[i][j]) {
  150. ans.pb(a[i]);
  151. y = j - bal[a[i]];
  152. }
  153. else
  154. y = j;
  155. x = pr[i][j];
  156. i = x;
  157. j = y;
  158. }
  159.  
  160. rev(all(ans));
  161.  
  162. cout << dp[n][0] << " " << sz(ans) << endl;
  163.  
  164. for (auto i : ans)
  165. cout << i << " ";
  166.  
  167. return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement