Guest User

e-olimp 1025

a guest
Jan 21st, 2013
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <vector>
  2. #include <list>
  3. #include <map>
  4. #include <set>
  5. #include <deque>
  6. #include <stack>
  7. #include <queue>
  8. #include <algorithm>
  9. #include <sstream>
  10. #include <iostream>
  11. #include <iomanip>
  12. #include <cstdio>
  13. #include <cmath>
  14. #include <cstdlib>
  15. #include <memory.h>
  16. #include <ctime>
  17.  
  18. using namespace std;
  19.  
  20. #define ABS(a) ((a>0)?a:-(a))
  21. #define MIN(a,b) ((a<b)?(a):(b))
  22. #define MAX(a,b) ((a<b)?(b):(a))
  23. #define FOR(i,a,n) for (int i=(a);i<(n);++i)
  24. #define FI(i,n) for (int i=0; i<(n); ++i)
  25. #define pnt pair <int, int>
  26. #define mp make_pair
  27. #define PI 3.14159265358979
  28. #define MEMS(a,b) memset(a,b,sizeof(a))
  29. #define LL long long
  30. #define U unsigned
  31. int base=1000000000;
  32. vector<int> add(vector<int> a, vector<int> b)
  33. {
  34.     int p=0;
  35.     for (int i=0; i<MAX(a.size(),b.size()) || p; ++i)
  36.     {
  37.         if (i==a.size())
  38.             a.push_back(0);
  39.         int v=0;
  40.         if (i<b.size())
  41.             v=b[i];
  42.         a[i]+=v+p;
  43.         p=(a[i]>=base);
  44.         if (a[i]>=base)
  45.             a[i]-=base;
  46.     }
  47.     return a;
  48. }
  49. string s;
  50. vector<int> dp[310][310];
  51. int was[310][310];
  52. vector<int> one,zero;
  53. int nextt[310][2];
  54. vector<int> r(int p, int b)
  55. {
  56.     if (was[p][b])
  57.         return dp[p][b];
  58.     if (p==s.size())
  59.     {
  60.         if ((b==0))
  61.             return one;
  62.         return zero;
  63.     }
  64.     was[p][b]=1;
  65.     vector<int> res;
  66.     if (b==0)
  67.         res=one;
  68.     else
  69.         res=zero;
  70.     if (nextt[p][0]!=s.size())
  71.         res=add(res,r(nextt[p][0]+1,b+1));
  72.     if ((b>0) && (nextt[p][1]!=s.size()))
  73.         res=add(res,r(nextt[p][1]+1,b-1));
  74.     return dp[p][b]=res;
  75. }
  76. int main()
  77. {
  78. #ifdef Fcdkbear
  79.     freopen("in.txt","r",stdin);
  80.    // freopen("out.txt","w",stdout);
  81.     double beg=clock();
  82. #endif
  83.    
  84.  
  85.     one.push_back(1);
  86.     zero.push_back(0);
  87.     cin>>s;
  88.     int v1=s.size(),v2=s.size();
  89.     for (int i=(int)s.size()-1; i>=0; --i)
  90.     {
  91.         if (s[i]=='(')
  92.             v1=i;
  93.         else
  94.             v2=i;
  95.         nextt[i][0]=v1;
  96.         nextt[i][1]=v2;
  97.     }
  98.     vector<int> res=r(0,0);
  99.     printf("%d",res.back());
  100.     for (int i=(int)res.size()-2; i>=0; --i)
  101.         printf("%09d",res[i]);
  102.     printf("\n");
  103.  
  104. #ifdef Fcdkbear
  105.     double end=clock();
  106.     fprintf(stderr,"*** Total time = %.3lf ***\n",(end-beg)/CLOCKS_PER_SEC);
  107. #endif
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment