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

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <set>
#include <string>
#include <vector>
typedef long long ll;
using namespace std;
#define INF (1 << 30)
#define INFLL (1LL << 60)
#define rep(i, n) for (int i = 0; i < (n); ++i)

int popcount(string bin) {
  int cnt = 0;
  rep(i, bin.size()) if (bin[i] == '1')++ cnt;
  return cnt;
}
int popcount(ll bits) {
  bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
  bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
  bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
  bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
  return (bits & 0x0000ffff) + (bits >> 16 & 0x0000ffff);
}
int funcOnce(string bin, int div) {
  int deci = 0;
  rep(i, bin.size()) deci = (deci * 2 + bin[i] - '0') % div;
  return deci;
}

vector<int> funcOnceNote(string bin, int div) {
  int deci = 0;
  int D = bin.size();
  vector<int> imod(D);
  rep(i, D) {
    deci = (deci * 2 + bin[i] - '0') % div;
    imod[D - i - 1] = deci;
  }
  return imod;
}

int func(string bin, int div) {
  if (div == 0)
    return 0;
  int deci = funcOnce(bin, div);
  int bitcnt = popcount(deci);
  int cnt = 1;
  while (deci > 0) {
    deci = deci % bitcnt;
    bitcnt = popcount(deci);
    ++cnt;
  }
  return cnt;
}

int main() {
  int N;
  cin >> N;
  string X;
  cin >> X;
  int bitcnt = popcount(X);

  string binn(N, '0');
  binn[0] = '1';

  int xmodp1, xmodm1;
  vector<int> imodp1, imodm1;

  xmodp1 = funcOnce(X, bitcnt + 1);
  imodp1 = funcOnceNote(binn, bitcnt + 1);
  if (bitcnt > 1) {
    xmodm1 = funcOnce(X, bitcnt - 1);
    imodm1 = funcOnceNote(binn, bitcnt - 1);
  }

  vector<int> ans(N, 0);
  rep(i, N) {
    int mod, xmod;
    if (X[i] == '1') {
      mod = bitcnt - 1;
      if (mod < 1)
        continue;
      xmod = (mod + xmodm1 - imodm1[i]) % mod;
    } else {
      mod = bitcnt + 1;
      xmod = (xmodp1 + imodp1[i]) % mod;
    }
    ++ans[i];
    while (xmod > 0) {
      xmod = xmod % popcount(xmod);
      ++ans[i];
    }
  }

  rep(i, N) cout << ans[i] << endl;
  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <set>
#include <string>
#include <vector>
typedef long long ll;
using namespace std;
#define INF (1 << 30)
#define INFLL (1LL << 60)
#define rep(i, n) for (int i = 0; i < (n); ++i)

int popcount(string bin) {
  int cnt = 0;
  rep(i, bin.size()) if (bin[i] == '1')++ cnt;
  return cnt;
}
int popcount(ll bits) {
  bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
  bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
  bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
  bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
  return (bits & 0x0000ffff) + (bits >> 16 & 0x0000ffff);
}
int funcOnce(string bin, int div) {
  int deci = 0;
  rep(i, bin.size()) deci = (deci * 2 + bin[i] - '0') % div;
  return deci;
}
int funcOnce(int deci, int div) { return deci % div; }

int func(string bin, int div) {
  if (div == 0)
    return 0;
  int deci = funcOnce(bin, div);
  int bitcnt = popcount(deci);
  int cnt = 1;
  while (deci > 0) {
    deci = funcOnce(deci, bitcnt);
    bitcnt = popcount(deci);
    ++cnt;
  }
  return cnt;
}

int main() {
  int N;
  cin >> N;
  string X;
  cin >> X;
  int bitcnt = popcount(X);
  int xmodp1 = funcOnce(X, bitcnt + 1);
  int xmodm1;
  if (bitcnt > 1) {
    xmodm1 = funcOnce(X, bitcnt - 1);
  }

  vector<int> ans(N, 0);

  rep(i, N) {
    string ibin(N - i, '0');
    ibin[0] = '1';
    int mod, imod, xmod;
    if (X[i] == '1') {
      mod = bitcnt - 1;
      if (mod < 1)
        continue;
      imod = funcOnce(ibin, mod);
      xmod = (mod + xmodm1 - imod) % mod;
    } else {
      mod = bitcnt + 1;
      imod = funcOnce(ibin, mod);
      xmod = (xmodp1 + imod) % mod;
    }
    ++ans[i];
    while (xmod > 0) {
      xmod = funcOnce(xmod, popcount(xmod));
      ++ans[i];
    }
  }

  rep(i, N) cout << ans[i] << endl;
  return 0;
}