func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( Ofast )   #pragma GCC optimization( unroll-loops, no-stack-protector )   #pragma GCC target( avx,avx2,fma )   using namespace std;   const int INF = int(1e9) + 99;   int main() {     ios::sync_with_stdio(false), cin.tie(0);     cout.tie(0);     int n;     string s;     cin >> n >> s;     vector<int> max_0(n + 1, 0);     vector<int> max_1(n + 1, 0);     for (int i = n - 1; i >= 0; --i) {       if (s[i] !=  0 ) max_1[i] = 1 + max_1[i + 1];       if (s[i] !=  1 ) max_0[i] = 1 + max_0[i + 1];     }     unordered_map<int, vector<int>> pos_0;     unordered_map<int, vector<int>> pos_1;     int c = 0;     while (c < n) {       if (c == 0 || s[c - 1] ==  1 ) {         for (int len = 1; len <= max_0[c]; ++len) {           pos_0[len].push_back(c);         }         c += max(max_0[c], 1);       } else {         ++c;       }     }     c = 0;     while (c < n) {       if (c == 0 || s[c - 1] ==  0 ) {         for (int len = 1; len <= max_1[c]; ++len) {           pos_1[len].push_back(c);         }         c += max(max_1[c], 1);       } else {         ++c;       }     }     for (int len = 1; len <= n; ++len) {       int pos = 0;       int ans = 0;       int index_0 = 0;       int index_1 = 0;       while (pos < n) {         int npos = INF;         if (max_0[pos] >= len) {           npos = min(npos, pos + len);         }         if (max_1[pos] >= len) {           npos = min(npos, pos + len);         }         while ((index_0 < (int)pos_0[len].size()) && (pos > pos_0[len][index_0]))           ++index_0;         while ((index_1 < (int)pos_1[len].size()) && (pos > pos_1[len][index_1]))           ++index_1;         if (index_0 < (int)pos_0[len].size()) {           npos = min(npos, pos_0[len][index_0] + len);         }         if (index_1 < (int)pos_1[len].size()) {           npos = min(npos, pos_1[len][index_1] + len);         }         if (npos != INF) {           ++ans;         }         pos = npos;       }       cout << ans <<    ;     }     cout << endl;   }   