Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef unsigned int ui;
- typedef pair < ll, ll > pll;
- typedef pair < int, ll > pil;
- typedef pair < ll, int > pli;
- typedef pair < int, int > pii;
- typedef unsigned long long ull;
- #define F first
- #define S second
- #define en end()
- #define bg begin()
- #define rev reverse
- #define mp make_pair
- #define pb push_back
- #define y1 y1234567890
- #define um unordered_map
- #define all(x) x.bg, x.en
- #define sqr(x) ((x) * (x))
- #define sz(x) (int)x.size()
- const ll inf = (ll)1e18;
- const ll mod = (ll)1e9 + 7;
- const double pi = acos(-1.0);
- const double eps = (double)1e-9;
- const int dx[] = {0, 0, 1, 0, -1};
- const int dy[] = {0, 1, 0, -1, 0};
- const int N = 1001;
- const int M = 10001;
- string s[N];
- bool u[N][M];
- vector < short > ans;
- short dp[N][M], pr[N][M];
- short n, len[N], bal[N], mbal[N], a[N];
- inline bool cmp(int i, int j) {
- int bal1 = 0, mbal1 = 0;
- for (int k = 0; k < len[a[i]]; k++) {
- if (s[a[i]][k] == '(')
- bal1++;
- else
- bal1--;
- mbal1 = min(mbal1, bal1);
- }
- for (int k = 0; k < len[a[j]]; k++) {
- if (s[a[j]][k] == '(')
- bal1++;
- else
- bal1--;
- mbal1 = min(mbal1, bal1);
- }
- int bal2 = 0, mbal2 = 0;
- for (int k = 0; k < len[a[j]]; k++) {
- if (s[a[j]][k] == '(')
- bal2++;
- else
- bal2--;
- mbal2 = min(mbal2, bal2);
- }
- for (int k = 0; k < len[a[i]]; k++) {
- if (s[a[i]][k] == '(')
- bal2++;
- else
- bal2--;
- mbal2 = min(mbal2, bal2);
- }
- /*cout << i << " " << j << " " << s[a[i]] + s[a[j]] << " " << s[a[j]] + s[a[i]] << endl;
- cout << mbal1 << " " << mbal2 << " " << bal1 << " " << bal2 << endl << endl;*/
- if (mbal1 == mbal2)
- return mbal[a[i]] > mbal[a[j]];
- return mbal1 > mbal2;
- }
- int main() {
- //freopen(".in", "r", stdin);
- //freopen(".out", "w", stdout);
- cin.tie(NULL);
- cout.tie(NULL);
- ios_base::sync_with_stdio(false);
- cin >> n;
- for (int i = 1; i <= n; i++) {
- cin >> s[i];
- mbal[i] = M;
- len[i] = sz(s[i]);
- for (int j = 0; j < len[i]; j++) {
- if (s[i][j] == '(')
- bal[i]++;
- else
- bal[i]--;
- mbal[i] = min(mbal[i], bal[i]);
- }
- a[i] = i;
- }
- //cout << endl;
- sort(a + 1, a + 1 + n, &cmp);
- /*for (int i = 1; i <= n; i++)
- cout << a[i] << " ";
- cout << endl;*/
- memset(dp, -1, sizeof(dp));
- for (int i = 0; i <= n; i++)
- for (int j = 0; j < M; j++)
- pr[i][j] = i;
- dp[0][0] = 0;
- for (int i = 1; i <= n; i++) {
- for (int j = 0; j < M; j++) {
- if (dp[i - 1][j] == -1)
- continue;
- if (j + mbal[a[i]] >= 0 && j + bal[a[i]] < M && dp[i - 1][j] + len[a[i]] > dp[i][j + bal[a[i]]]) {
- dp[i][j + bal[a[i]]] = dp[i - 1][j] + len[a[i]];
- if (u[i - 1][j])
- pr[i][j + bal[a[i]]] = i - 1;
- else
- pr[i][j + bal[a[i]]] = pr[i - 1][j];
- u[i][j + bal[a[i]]] = 1;
- }
- if (dp[i - 1][j] > dp[i][j]) {
- dp[i][j] = dp[i - 1][j];
- if (u[i - 1][j])
- pr[i][j] = i - 1;
- else
- pr[i][j] = pr[i - 1][j];
- u[i][j] = 0;
- }
- }
- }
- int i = n, j = 0;
- while (i) {
- int x, y;
- if (u[i][j]) {
- ans.pb(a[i]);
- y = j - bal[a[i]];
- }
- else
- y = j;
- x = pr[i][j];
- i = x;
- j = y;
- }
- rev(all(ans));
- cout << dp[n][0] << " " << sz(ans) << endl;
- for (auto i : ans)
- cout << i << " ";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement