Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
- using namespace std;
- vector<vector<bool>> dp;
- string s;
- int it = 0;
- void rev_merge(vector<int>& c, int l, int r) {
- if (r - l <= 1)
- return;
- int m = (l + r) >> 1;
- vector<int> a(m - l);
- vector<int> b(r - m);
- int itl = 0;
- int itr = 0;
- int i = l;
- int count0 = 0;
- int count1 = 0;
- int it_begin = it;
- while (r - l > 1 && it >= 0 && count0 < a.size() && count1 < b.size()) {
- (s[it] == '0' ? count0++ : count1++);
- it--;
- }
- int it_ = it + 1;
- while (it_ <= it_begin && itl < a.size() && itr < b.size()) {
- if (s[it_] == '0')
- a[itl++] = c[i++];
- else
- b[itr++] = c[i++];
- it_++;
- }
- while (itl < a.size())
- a[itl++] = c[i++];
- while (itr < b.size())
- b[itr++] = c[i++];
- for (int j = l; j < m; j++)
- c[j] = a[j - l];
- for (int j = m; j < r; j++)
- c[j] = b[j - m];
- rev_merge(c, m, r);
- rev_merge(c, l, m);
- }
- int main() {
- cin >> s;
- it = s.size() - 1;
- int n = s.size();
- dp.assign(n + 1, vector<bool>(9, false));
- dp[n - 1] = vector<bool>(9, true);
- for (int i = n - 1; i >= 0; i--) {
- bool f = false;
- for (int j = 0; j < 9; j++)
- f |= dp[i][j];
- if (!f)
- continue;
- int count[2] = {};
- for (int j = i; j >= 0 && count[s[j] - '0'] < 9; j--) {
- count[s[j] - '0']++;
- if (count[(s[i] - 'a' + 1) % 2] < count[s[i] - 'a'])
- dp[j][s[i] - 'a'] = true;
- }
- }
- vector<int> a(16);
- for (int i = 0; i < 16; i++)
- a[i] = i+1;
- rev_merge(a, 0, 16);
- for (int i : a)
- cout << i << ", ";
- cout << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment