Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.69 KB | None | 0 0
  1. #include <vector>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. int k;
  7. vector<string> first;
  8. long long slen[700];
  9.  
  10. struct Dat {
  11. long long max, maxLeft, maxRight;
  12. bool allOne;
  13. Dat() : max(0), maxLeft(0), maxRight(0), allOne(false) {
  14. }
  15. };
  16.  
  17. Dat cache[700];
  18. bool visit[700];
  19.  
  20. Dat go(int n, long long lo, long long hi) {
  21. if (lo == 0 && hi == slen[n] - 1 && visit[n]) {
  22. return cache[n];
  23. }
  24.  
  25. if (n < k) {
  26. Dat ret;
  27. for (int i = lo; i <= hi && first[n][i] == '1'; ++i) {
  28. ret.maxLeft++;
  29. }
  30. for (int i = hi; i >= lo && first[n][i] == '1'; --i) {
  31. ret.maxRight++;
  32. }
  33. long long cnt = 0;
  34. for (int i = lo; i <= hi; ++i) {
  35. if (first[n][i] == '1') ++cnt;
  36. else cnt = 0;
  37. ret.max = max(ret.max, cnt);
  38. }
  39. ret.allOne = (ret.maxLeft == hi - lo + 1);
  40.  
  41. if (lo == 0 && hi == slen[n] - 1) {
  42. cache[n] = ret;
  43. visit[n] = true;
  44. }
  45. return ret;
  46. }
  47.  
  48. vector<Dat> subs;
  49. long long prefixLen = 0;
  50. for (int i = n - 1; i >= 0; i -= k) {
  51. if (lo < prefixLen + slen[i]) {
  52. Dat sub = go(i, max(lo - prefixLen, 0ll), min(hi - prefixLen, slen[i] - 1));
  53. subs.push_back(sub);
  54. }
  55. prefixLen += slen[i];
  56. if (hi < prefixLen) break;
  57. }
  58.  
  59. Dat ret;
  60. for (int i = 0; i < subs.size(); ++i) {
  61. ret.maxLeft += subs[i].maxLeft;
  62. ret.max = max(ret.max, ret.maxLeft);
  63. if (!subs[i].allOne) break;
  64. }
  65. for (int i = subs.size() - 1; i >= 0; --i) {
  66. ret.maxRight += subs[i].maxRight;
  67. ret.max = max(ret.max, ret.maxRight);
  68. if (!subs[i].allOne) break;
  69. }
  70. long long val = 0;
  71. for (int i = 0; i < subs.size(); ++i) {
  72. val += subs[i].maxLeft;
  73. ret.max = max(ret.max, val);
  74. ret.max = max(ret.max, subs[i].max);
  75. if (!subs[i].allOne) val = subs[i].maxRight;
  76. }
  77. ret.allOne = (ret.maxLeft == hi - lo + 1);
  78.  
  79. if (lo == 0 && hi == slen[n] - 1) {
  80. cache[n] = ret;
  81. visit[n] = true;
  82. }
  83. return ret;
  84. }
  85.  
  86. class MagicalGirlLevelThreeDivOne {
  87. public:
  88. long long theMaxPower(vector<string> _first, int n, long long lo, long long hi) {
  89. first = _first;
  90. k = first.size();
  91.  
  92. int limit = 0;
  93. for (int i = 0; i <= n; ++i) {
  94. if (i < k) {
  95. slen[i] = first[i].length();
  96. }
  97. else {
  98. for (int j = i - 1; j >= 0; j -= k) {
  99. slen[i] += slen[j];
  100. }
  101. }
  102.  
  103. if (i >= k && hi < slen[i]) break;
  104. ++limit;
  105. }
  106.  
  107. return go(min(n, limit), lo, hi).max;
  108. }
  109. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement