makrusak

1745

Apr 23rd, 2013
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.05 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <string>
  7. #include <string.h>
  8. #include <queue>
  9. #include <stack>
  10. #include <deque>
  11. #include <map>
  12. #include <set>
  13. #include <cmath>
  14. #include <sstream>
  15. #include <ctime>
  16.  
  17. #define pb push_back
  18. #define mp make_pair
  19. #define PI 3.1415926535897932384626433832795
  20. #define ALL(x) x.begin(), x.end()
  21. #define F first
  22. #define S second
  23. #define m0(x) memset(x,0,sizeof(x))
  24. #define m1(x) memset(x,-1,sizeof(x))
  25. #define pw(x) (1ull<<(x))
  26.  
  27. using namespace std;
  28. typedef long long ll;
  29. typedef unsigned long long ull;
  30. typedef long double ld;
  31. typedef pair<int,int> pii;
  32. const int INF = 2147483647;
  33. const ll LLINF = 9223372036854775807LL;
  34.  
  35. struct it {
  36.   int r,g,l,n;
  37.   it(int r = 0, int g = 0, int l = 0, int n=0): r(r), g(g), l(l), n(n) {}
  38.   bool operator <(const it &a) const{
  39.     return (this->g > a.g);
  40.   }
  41. };
  42.  
  43. int n, k = 0;
  44. it a[1010];
  45. int dp[1010][5010];
  46. int dr[1010][5010];
  47. char s[10010];
  48.  
  49. int main() {
  50.   //freopen("input.txt", "r", stdin);
  51.   //freopen("output.txt", "w", stdout);
  52.   cin >> n;
  53.   for (int i=0;i<n;i++) {
  54.     scanf("%s", s); int len = strlen(s);
  55.     int b = 0, g = 0;
  56.     for (int j=0;j<len;j++) {
  57.       if (s[j]=='(') b++;
  58.       else b--;
  59.       if (b<g) g=b;
  60.     }
  61.     a[i] = it(b,g,len, i+1);
  62.   }
  63.   sort(a, a+n);
  64.   m1(dp);
  65.   dp[0][0] = 0;
  66.   for (int i=0;i<n;i++) {
  67.     for (int d=0;d<5010;d++) {
  68.       if (dp[i][d]==-1) continue;
  69.       if (dp[i][d]>dp[i+1][d]) {
  70.         dp[i+1][d] = dp[i][d];
  71.         dr[i+1][d] = d;
  72.       }
  73.       if (d+a[i].g<0 || d+a[i].r>=5010) continue;
  74.       if (dp[i][d]+a[i].l>dp[i+1][d+a[i].r]) {
  75.         dp[i+1][d+a[i].r] = dp[i][d]+a[i].l;
  76.         dr[i+1][d+a[i].r] = d;
  77.       }
  78.     }
  79.   }
  80.   cout << dp[n][0] << " ";
  81.   vector<int> ans;
  82.   int d = 0;
  83.   for (int i=n;i>0;i--) {
  84.     int pre = dr[i][d];
  85.     if (dp[i-1][pre]<dp[i][d]) ans.pb(a[i-1].n);
  86.     d = pre;
  87.   }
  88.   reverse(ALL(ans));
  89.   cout << ans.size() << "\n";
  90.   for (int i=0;i<ans.size();i++) cout << ans[i] << " ";
  91.   return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment