Source code for submission s1005

fq.cpp

  1. #include <iostream>
  2. #include <cctype>
  3. #include <cmath>
  4. #include <complex>
  5. #include <cstdio>
  6. #include <string>
  7. #include <list>
  8. #include <map>
  9. #include <queue>
  10. #include <set>
  11. #include <sstream>
  12. #include <stack>
  13. #include <utility>
  14. #include <vector>
  15.  
  16. using namespace std;
  17.  
  18. #define DEBUG(x) cout << ">>> " #x << " : " << x << endl;
  19.  
  20.  
  21. unsigned solve(std::string & str)
  22. {
  23. unsigned fixedOpeners(0);
  24. unsigned fixedClosers(0);
  25. unsigned visitedFixedOpeners(0);
  26. unsigned visitedFixedClosers(0);
  27.  
  28. for (std::string::iterator pnter(str.begin()); pnter!=str.end(); ++pnter)
  29. {
  30. if (*pnter == ')')
  31. ++fixedClosers;
  32. if (*pnter == '(')
  33. ++fixedOpeners;
  34. }
  35.  
  36. std::vector<unsigned> states(str.size()/2 + 2, 0);
  37. states[0]=1;
  38. for(unsigned index(0); index<str.size(); ++index)
  39. {
  40. std::vector<unsigned> newStates(str.size()/2 + 2, 0);
  41.  
  42. // opener
  43. if (str[index] == '(')
  44. {
  45. ++visitedFixedOpeners;
  46. for(unsigned state(0); state<=str.size()/2; ++state)
  47. {
  48. newStates[state + 1] += states[state];
  49. newStates[state + 1] %= 1000000;
  50. }
  51. }
  52. // closer
  53. else if (str[index] == ')')
  54. {
  55. ++visitedFixedClosers;
  56. for(unsigned state(1); state<=str.size()/2; ++state)
  57. {
  58. newStates[state - 1] += states[state];
  59. newStates[state - 1] %= 1000000;
  60. }
  61. }
  62. // rational
  63. else
  64. {
  65. for(unsigned state(0); state<=str.size()/2; ++state)
  66. {
  67. int availableOpeners(str.size()/2 - fixedOpeners - (index - state)/2 + visitedFixedOpeners - state);
  68. int availableClosers(str.size()/2 - fixedClosers - (index - state)/2 + visitedFixedClosers);
  69. if (state && availableClosers>0)
  70. {
  71. newStates[state - 1] += states[state];
  72. newStates[state - 1] %= 1000000;
  73. }
  74. if (availableOpeners > 0)
  75. {
  76. newStates[state + 1] += states[state];
  77. newStates[state + 1] %= 1000000;
  78. }
  79. }
  80. }
  81.  
  82. // swap
  83. states.swap(newStates);
  84. }
  85.  
  86. return states[0];
  87. }
  88.  
  89. int main()
  90. {
  91. std::string line;
  92. while (std::cin>>line)
  93. std::cout << solve(line) << std::endl;
  94.  
  95. return 0;
  96. }
  97.