Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstdlib>
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <string>
- #include <string.h>
- #include <queue>
- #include <stack>
- #include <deque>
- #include <map>
- #include <set>
- #include <cmath>
- #include <sstream>
- #include <ctime>
- #define pb push_back
- #define mp make_pair
- #define PI 3.1415926535897932384626433832795
- #define ALL(x) x.begin(), x.end()
- #define F first
- #define S second
- #define m0(x) memset(x,0,sizeof(x))
- #define m1(x) memset(x,-1,sizeof(x))
- #define pw(x) (1ull<<(x))
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef long double ld;
- typedef pair<int,int> pii;
- const int INF = 2147483647;
- const ll LLINF = 9223372036854775807LL;
- struct it {
- int r,g,l,n;
- it(int r = 0, int g = 0, int l = 0, int n=0): r(r), g(g), l(l), n(n) {}
- bool operator <(const it &a) const{
- return (this->g > a.g);
- }
- };
- int n, k = 0;
- it a[1010];
- int dp[1010][5010];
- int dr[1010][5010];
- char s[10010];
- int main() {
- //freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- cin >> n;
- for (int i=0;i<n;i++) {
- scanf("%s", s); int len = strlen(s);
- int b = 0, g = 0;
- for (int j=0;j<len;j++) {
- if (s[j]=='(') b++;
- else b--;
- if (b<g) g=b;
- }
- a[i] = it(b,g,len, i+1);
- }
- sort(a, a+n);
- m1(dp);
- dp[0][0] = 0;
- for (int i=0;i<n;i++) {
- for (int d=0;d<5010;d++) {
- if (dp[i][d]==-1) continue;
- if (dp[i][d]>dp[i+1][d]) {
- dp[i+1][d] = dp[i][d];
- dr[i+1][d] = d;
- }
- if (d+a[i].g<0 || d+a[i].r>=5010) continue;
- if (dp[i][d]+a[i].l>dp[i+1][d+a[i].r]) {
- dp[i+1][d+a[i].r] = dp[i][d]+a[i].l;
- dr[i+1][d+a[i].r] = d;
- }
- }
- }
- cout << dp[n][0] << " ";
- vector<int> ans;
- int d = 0;
- for (int i=n;i>0;i--) {
- int pre = dr[i][d];
- if (dp[i-1][pre]<dp[i][d]) ans.pb(a[i-1].n);
- d = pre;
- }
- reverse(ALL(ans));
- cout << ans.size() << "\n";
- for (int i=0;i<ans.size();i++) cout << ans[i] << " ";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment