Problem p02609 (C++) — buggy submission, verdict: Time Limit Exceeded

// #include <bits/stdc++.h>
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;

#include "boost/multiprecision/cpp_dec_float.hpp"
#include "boost/multiprecision/cpp_int.hpp"
namespace mp = boost::multiprecision;
typedef mp::cpp_int LL;
typedef mp::number<mp::cpp_dec_float<1024>>
    DD; // 仮数部が1024ビットの浮動小数点数型(TLEしたら小さくする)

typedef long double dd;
#define i_7 (ll)(1E9 + 7)
// #define i_7 998244353
#define i_5 i_7 - 2
ll mod(ll a) {
  ll c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
typedef pair<ll, ll> l_l;
typedef pair<dd, dd> d_d;
ll inf = (ll)1E16;
#define rep(i, l, r) for (ll i = l; i <= r; i++)
#define rrep(i, r, l) for (ll i = r; i >= l; i--)
#define pb push_back
ll max(ll a, ll b) {
  if (a < b)
    return b;
  else
    return a;
}
ll min(ll a, ll b) {
  if (a > b)
    return b;
  else
    return a;
}
void Max(ll &pos, ll val) { pos = max(pos, val); } // Max(dp[n],dp[n-1]);
void Min(ll &pos, ll val) { pos = min(pos, val); }
void Add(ll &pos, ll val) { pos = mod(pos + val); }
dd EPS = 1E-9;
#define fastio                                                                 \\
  ios::sync_with_stdio(false);                                                 \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define fi first
#define se second
#define endl                                                                   \\
  "\\n" // インタラクティブで消す！！！！！！！！！！！！！！！！！！！！！
#define SORT(v) sort(v.begin(), v.end())
#define ERASE(v) v.erase(unique(v.begin(), v.end()), v.end())
#define POSL(v, x) (lower_bound(v.begin(), v.end(), x) - v.begin())
#define POSU(v, x) (upper_bound(v.begin(), v.end(), x) - v.begin())
template <class T, class S> inline bool chmax(T &a, S b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T, class S> inline bool chmin(T &a, S b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

void mod_print(ll k) {
  ll P = 1000;
  rep(y, 1, P) {
    ll x = mod(y * k);
    if (x + P >= i_7) {
      x -= i_7;
    }
    if (abs(x) <= P) {
      // cout<<x<<"/"<<y;
      cout << setprecision(5) << (dd)x / (dd)y;
      return;
    }
  }
  cout << "nun" << endl;
}
#define all(c) c.begin(), c.end()
//////////////////////////

LL pop(LL n) {
  ll res = 0;
  while (n > 0) {
    if (n & 1)
      res++;
    n /= 2;
  }
  return res;
}
void pre() {
  set<ll> se;
  LL s = 0;
  for (LL i = s; i <= s + 10000; i++) {
    LL s = i;
    ll res = 0;
    while (s > 0) {
      res++;
      LL t = pop(s);
      s = s % t;
    }
    cout << i << ":" << res << endl;
    // se.insert(res);
  }
  for (auto x : se)
    cout << x << " ";
  cout << endl;
}

void guc() {
  ll n;
  string y;
  cin >> n >> y;
  LL x = 0;
  LL c = 1;
  rrep(i, n - 1, 0) {
    if (y[i] == '1')
      x += c;
    c *= 2;
  }
  // cout<<x<<endl;

  ll ans[n];
  memset(ans, 0, sizeof(ans));
  c = 1;
  rrep(i, n - 1, 0) {
    LL s = x;
    if (y[i] == '1')
      s -= c;
    else
      s += c;
    while (s > 0) {
      ans[i]++;
      LL t = pop(s);
      s = s % t;
    }
    c *= 2;
  }
  rep(i, 0, n - 1) cout << ans[i] << endl;
}
int main() {
  fastio
      // pre();
      // guc();

      ll n;
  string x;
  cin >> n >> x;
  ll cc = 0;
  rep(i, 0, n - 1) if (x[i] == '1') cc++;
  ll a[n], b[n];
  a[n - 1] = 1 % (cc + 1);
  rrep(i, n - 2, 0) { a[i] = (a[i + 1] * 2) % (cc + 1); }
  if (cc >= 2) {
    b[n - 1] = 1 % (cc - 1);
    rrep(i, n - 2, 0) { b[i] = (b[i + 1] * 2) % (cc - 1); }
  }
  LL z = 0;
  LL c = 1;
  rrep(i, n - 1, 0) {
    if (x[i] == '1')
      z += c;
    c *= 2;
  }

  LL za = z % (cc + 1);
  LL zb;
  if (cc >= 2) {
    zb = z % (cc - 1);
  }
  ll nx[n];
  rep(i, 0, n - 1) {
    if (x[i] == '0') {
      nx[i] = (ll)(za + a[i]) % (cc + 1);
    } else {
      if (cc >= 2) {
        nx[i] = (ll)(zb - b[i]) % (cc - 1);
        if (nx[i] < 0)
          nx[i] += (cc - 1);
      }
    }
  }
  ll N = 200005;
  ll dp[N];
  dp[0] = 0;
  rep(i, 1, N - 1) {
    ll t = (ll)pop(i);
    dp[i] = 1 + dp[i % t];
  }

  ll ans[n];
  rep(i, 0, n - 1) {
    if (cc == 1 && x[i] == '1')
      continue;
    ans[i] = 1 + dp[nx[i]];
  }
  if (cc == 1) {
    rep(i, 0, n - 1) if (x[i] == '1') ans[i] = 0;
  }
  rep(i, 0, n - 1) cout << ans[i] << endl;

  return 0;
}


Error: TLE

Fixed submission:

// #include <bits/stdc++.h>
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;

#include "boost/multiprecision/cpp_dec_float.hpp"
#include "boost/multiprecision/cpp_int.hpp"
namespace mp = boost::multiprecision;
typedef mp::cpp_int LL;
typedef mp::number<mp::cpp_dec_float<1024>>
    DD; // 仮数部が1024ビットの浮動小数点数型(TLEしたら小さくする)

typedef long double dd;
#define i_7 (ll)(1E9 + 7)
// #define i_7 998244353
#define i_5 i_7 - 2
ll mod(ll a) {
  ll c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
typedef pair<ll, ll> l_l;
typedef pair<dd, dd> d_d;
ll inf = (ll)1E16;
#define rep(i, l, r) for (ll i = l; i <= r; i++)
#define rrep(i, r, l) for (ll i = r; i >= l; i--)
#define pb push_back
ll max(ll a, ll b) {
  if (a < b)
    return b;
  else
    return a;
}
ll min(ll a, ll b) {
  if (a > b)
    return b;
  else
    return a;
}
void Max(ll &pos, ll val) { pos = max(pos, val); } // Max(dp[n],dp[n-1]);
void Min(ll &pos, ll val) { pos = min(pos, val); }
void Add(ll &pos, ll val) { pos = mod(pos + val); }
dd EPS = 1E-9;
#define fastio                                                                 \\
  ios::sync_with_stdio(false);                                                 \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define fi first
#define se second
#define endl                                                                   \\
  "\\n" // インタラクティブで消す！！！！！！！！！！！！！！！！！！！！！
#define SORT(v) sort(v.begin(), v.end())
#define ERASE(v) v.erase(unique(v.begin(), v.end()), v.end())
#define POSL(v, x) (lower_bound(v.begin(), v.end(), x) - v.begin())
#define POSU(v, x) (upper_bound(v.begin(), v.end(), x) - v.begin())
template <class T, class S> inline bool chmax(T &a, S b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T, class S> inline bool chmin(T &a, S b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

void mod_print(ll k) {
  ll P = 1000;
  rep(y, 1, P) {
    ll x = mod(y * k);
    if (x + P >= i_7) {
      x -= i_7;
    }
    if (abs(x) <= P) {
      // cout<<x<<"/"<<y;
      cout << setprecision(5) << (dd)x / (dd)y;
      return;
    }
  }
  cout << "nun" << endl;
}
#define all(c) c.begin(), c.end()
//////////////////////////

LL pop(LL n) {
  ll res = 0;
  while (n > 0) {
    if (n & 1)
      res++;
    n /= 2;
  }
  return res;
}

int main() {
  fastio
      /*
      rep(i,1,200000){
          ll s=i;
          vector<ll>v;
          while(s>0){
              v.pb(s);
              ll t=pop(s);
              s=s%t;
          }
          cout<<i<<":";
          for(auto x:v)cout<<x<<" ";
          cout<<endl;
      }*/
      ll n;
  string y;
  cin >> n >> y;
  LL x = 0;
  LL c = 1;
  rrep(i, n - 1, 0) {
    if (y[i] == '1')
      x += c;
    c *= 2;
  }
  // cout<<x<<endl;
  ll ans[n];
  memset(ans, 0, sizeof(ans));
  c = 1;
  rrep(i, n - 1, 0) {
    LL s = x;
    if (y[i] == '1')
      s -= c;
    else
      s += c;
    while (s > 0) {
      ans[i]++;
      LL t = pop(s);
      s = s % t;
    }
    c *= 2;
  }
  rep(i, 0, n - 1) cout << ans[i] << endl;

  return 0;
}