Raslboyy

Untitled

May 30th, 2021
1,083
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. vector<vector<bool>> dp;
  9. string s;
  10. int it = 0;
  11.  
  12. void rev_merge(vector<int>& c, int l, int r) {
  13.   if (r - l <= 1)
  14.     return;
  15.   int m = (l + r) >> 1;
  16.   vector<int> a(m - l);
  17.   vector<int> b(r - m);
  18.   int itl = 0;
  19.   int itr = 0;
  20.   int i = l;
  21.   int count0 = 0;
  22.   int count1 = 0;
  23.   int it_begin = it;
  24.   while (r - l > 1 && it >= 0 && count0 < a.size() && count1 < b.size()) {
  25.     (s[it] == '0' ? count0++ : count1++);
  26.     it--;
  27.   }
  28.   int it_ = it + 1;
  29.  
  30.   while (it_ <= it_begin && itl < a.size() && itr < b.size()) {
  31.     if (s[it_] == '0')
  32.       a[itl++] = c[i++];
  33.     else
  34.       b[itr++] = c[i++];
  35.     it_++;
  36.   }
  37.   while (itl < a.size())
  38.     a[itl++] = c[i++];
  39.   while (itr < b.size())
  40.     b[itr++] = c[i++];
  41.   for (int j = l; j < m; j++)
  42.     c[j] = a[j - l];
  43.   for (int j = m; j < r; j++)
  44.     c[j] = b[j - m];
  45.   rev_merge(c, m, r);
  46.   rev_merge(c, l, m);
  47. }
  48.  
  49. int main() {
  50.  
  51.   cin >> s;
  52.   it = s.size() - 1;
  53.   int n = s.size();
  54.   dp.assign(n + 1, vector<bool>(9, false));
  55.  
  56.   dp[n - 1] = vector<bool>(9, true);
  57.   for (int i = n - 1; i >= 0; i--) {
  58.     bool f = false;
  59.     for (int j = 0; j < 9; j++)
  60.       f |= dp[i][j];
  61.     if (!f)
  62.       continue;
  63.     int count[2] = {};
  64.     for (int j = i; j >= 0 && count[s[j] - '0'] < 9; j--) {
  65.       count[s[j] - '0']++;
  66.       if (count[(s[i] - 'a' + 1) % 2] < count[s[i] - 'a'])
  67.         dp[j][s[i] - 'a'] = true;
  68.     }
  69.   }
  70.  
  71.   vector<int> a(16);
  72.   for (int i = 0; i < 16; i++)
  73.     a[i] = i+1;
  74.   rev_merge(a, 0, 16);
  75.  
  76.   for (int i : a)
  77.     cout << i << ", ";
  78.   cout << '\n';
  79.  
  80.   return 0;
  81. }
  82.  
Advertisement
Add Comment
Please, Sign In to add comment