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

#include <bits/stdc++.h>
#define rep(i, a, ...)                                                         \\
  for (int i = (a) * (strlen(#__VA_ARGS__) != 0);                              \\
       i < (int)(strlen(#__VA_ARGS__) ? __VA_ARGS__ : (a)); ++i)
#define per(i, a, ...)                                                         \\
  for (int i = (strlen(#__VA_ARGS__) ? __VA_ARGS__ : (a)) - 1;                 \\
       i >= (int)(strlen(#__VA_ARGS__) ? (a) : 0); --i)
#define foreach(i, n) for (auto &i : (n))
#define pii pair<int, int>
#define pll pair<long long, long long>
#define all(x) (x).begin(), (x).end()
#define bit(x) (1ll << (x))
#define method(name, res, ...)                                                 \\
  function<res(__VA_ARGS__)> name = [&](__VA_ARGS__) -> res
using ll = long long;
// const ll MOD = (ll)1e9+7;
const ll MOD = 998244353;
const int INF = (ll)1e9 + 7;
const ll INFLL = (ll)1e18;
using namespace std;
template <class t> using vvector = vector<vector<t>>;
template <class t> using vvvector = vector<vector<vector<t>>>;
template <class t>
using priority_queuer = priority_queue<t, vector<t>, greater<t>>;
template <class t, class u> bool chmax(t &a, u b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class t, class u> bool chmin(t &a, u b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
#ifdef DEBUG
#define debug(x)                                                               \\
  cout << "LINE " << __LINE__ << ": " << #x << " = " << x << endl;
#else
#define debug(x) (void)0
#endif

namespace templates {
ll modpow(ll x, ll b) {
  ll res = 1;
  while (b) {
    if (b & 1)
      res = res * x % MOD;
    x = x * x % MOD;
    b >>= 1;
  }
  return res;
}

ll modinv(ll x) { return modpow(x, MOD - 2); }

bool was_output = false;
template <class t> void output(t a) {
  if (was_output)
    cout << " ";
  cout << a;
  was_output = true;
}
void outendl() {
  was_output = false;
  cout << endl;
}
ll in() {
  ll res;
  scanf("%lld", &res);
  return res;
}

template <class t> istream &operator>>(istream &is, vector<t> &x) {
  for (auto &i : x)
    is >> i;
  return is;
}

template <class t, class u> istream &operator>>(istream &is, pair<t, u> &x) {
  is >> x.first >> x.second;
  return is;
}

template <class t> void in(t &x) { cin >> x; }

template <class t> t in() {
  t res;
  cin >> res;
  return res;
}

template <class t> void out(t x) { cout << x; }

template <class t>
vector<t> sorted(
    vector<t> line,
    function<bool(t, t)> comp = [](t a, t b) { return a < b; }) {
  sort(line.begin(), line.end(), comp);
  return line;
}

template <class t> vector<t> reversed(vector<t> line) {
  reverse(line.begin(), line.end());
  return line;
}
} // namespace templates

using namespace templates;

template <long long mod> class modint {
public:
  long long x;
  modint(long long a) {
    x = a % mod;
    if (x < 0)
      x += mod;
  }
  modint() { x = 0; }

  modint pow(long long a) {
    modint res(1), b(x);
    while (a) {
      if (a & 1)
        res *= b;
      b *= b;
      a >>= 1;
    }
    return res;
  }

  modint inv() { return pow(mod - 2); }

  modint &operator+=(modint a) {
    x = (x + a.x) % mod;
    return *this;
  }
  modint &operator-=(modint a) {
    x = x - a.x;
    if (x < 0)
      x += mod;
    return *this;
  }
  modint &operator*=(modint a) {
    x = x * a.x % mod;
    return *this;
  }
  modint &operator/=(modint a) {
    x = x * a.inv().x % mod;
    return *this;
  }

  modint operator+(modint a) { return modint(x) += a; }
  modint operator-(modint a) { return modint(x) -= a; }
  modint operator*(modint a) { return modint(x) *= a; }
  modint operator/(modint a) { return modint(x) /= a; }

  modint operator-() { return modint(x); }

  bool operator==(const modint a) { return x == a.x; }
  bool operator<(const modint a) { return x < a.x; }
  bool operator>(const modint a) { return x > a.x; }
};

template <long long mod>
ostream &operator<<(ostream &os, const modint<mod> &a) {
  os << a.x;
  return os;
}

using mint = modint<MOD>;

mint func() {
  vector<int> line;
  int val = 0;
  {
    string str = in<string>();
    int cnt = 0;
    foreach (i, str) {
      if (i == '0') {
        if (cnt) {
          val += cnt;
          line.emplace_back(cnt);
          cnt = 0;
        }
        line.emplace_back(0);
      } else {
        ++cnt;
      }
    }
    if (cnt) {
      val += cnt;
      line.emplace_back(cnt);
    }
  }
  int n = line.size();
  int k = in();
  val;

  method(func, mint, int place, int need, int applyed) {
    if (place >= n) {
      if (need == applyed) {
        return 1;
      }
      return 0;
    }
    static vvvector<mint> dp(n, vvector<mint>(val + 1, vector<mint>(val + 1)));
    static vvvector<bool> used(
        n, vvector<bool>(val + 1, vector<bool>(val + 1, false)));
    mint &it = dp[place][need][applyed];
    if (used[place][need][applyed])
      return it;
    used[place][need][applyed] = true;
    it = 0;
    if (line[place]) {
      if (place + 1 < n) {
        rep(i, need + 1, min(k, val) + 1) { it += func(place + 2, i, applyed); }
      }
      rep(i, min(need - applyed, line[place]) + 1) {
        it += func(place + 2, need, applyed + i);
      }
    } else {
      if (need < min(k, val)) {
        it += func(place, need + 1, applyed);
      }
      it += func(place + 1, need, applyed);
    }
    return it;
  };

  return func(0, 0, 0);
}

int main() {
  cout << func() << endl;
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, a, ...)                                                         \\
  for (int i = (a) * (strlen(#__VA_ARGS__) != 0);                              \\
       i < (int)(strlen(#__VA_ARGS__) ? __VA_ARGS__ : (a)); ++i)
#define per(i, a, ...)                                                         \\
  for (int i = (strlen(#__VA_ARGS__) ? __VA_ARGS__ : (a)) - 1;                 \\
       i >= (int)(strlen(#__VA_ARGS__) ? (a) : 0); --i)
#define foreach(i, n) for (auto &i : (n))
#define pii pair<int, int>
#define pll pair<long long, long long>
#define all(x) (x).begin(), (x).end()
#define bit(x) (1ll << (x))
#define method(name, res, ...)                                                 \\
  function<res(__VA_ARGS__)> name = [&](__VA_ARGS__) -> res
using ll = long long;
// const ll MOD = (ll)1e9+7;
const ll MOD = 998244353;
const int INF = (ll)1e9 + 7;
const ll INFLL = (ll)1e18;
using namespace std;
template <class t> using vvector = vector<vector<t>>;
template <class t> using vvvector = vector<vector<vector<t>>>;
template <class t>
using priority_queuer = priority_queue<t, vector<t>, greater<t>>;
template <class t, class u> bool chmax(t &a, u b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class t, class u> bool chmin(t &a, u b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
#ifdef DEBUG
#define debug(x)                                                               \\
  cout << "LINE " << __LINE__ << ": " << #x << " = " << x << endl;
#else
#define debug(x) (void)0
#endif

namespace templates {
ll modpow(ll x, ll b) {
  ll res = 1;
  while (b) {
    if (b & 1)
      res = res * x % MOD;
    x = x * x % MOD;
    b >>= 1;
  }
  return res;
}

ll modinv(ll x) { return modpow(x, MOD - 2); }

bool was_output = false;
template <class t> void output(t a) {
  if (was_output)
    cout << " ";
  cout << a;
  was_output = true;
}
void outendl() {
  was_output = false;
  cout << endl;
}
ll in() {
  ll res;
  scanf("%lld", &res);
  return res;
}

template <class t> istream &operator>>(istream &is, vector<t> &x) {
  for (auto &i : x)
    is >> i;
  return is;
}

template <class t, class u> istream &operator>>(istream &is, pair<t, u> &x) {
  is >> x.first >> x.second;
  return is;
}

template <class t> void in(t &x) { cin >> x; }

template <class t> t in() {
  t res;
  cin >> res;
  return res;
}

template <class t> void out(t x) { cout << x; }

template <class t>
vector<t> sorted(
    vector<t> line,
    function<bool(t, t)> comp = [](t a, t b) { return a < b; }) {
  sort(line.begin(), line.end(), comp);
  return line;
}

template <class t> vector<t> reversed(vector<t> line) {
  reverse(line.begin(), line.end());
  return line;
}
} // namespace templates

using namespace templates;

template <long long mod> class modint {
public:
  long long x;
  modint(long long a) {
    x = a % mod;
    if (x < 0)
      x += mod;
  }
  modint() { x = 0; }

  modint pow(long long a) {
    modint res(1), b(x);
    while (a) {
      if (a & 1)
        res *= b;
      b *= b;
      a >>= 1;
    }
    return res;
  }

  modint inv() { return pow(mod - 2); }

  modint &operator+=(modint a) {
    x = (x + a.x) % mod;
    return *this;
  }
  modint &operator-=(modint a) {
    x = x - a.x;
    if (x < 0)
      x += mod;
    return *this;
  }
  modint &operator*=(modint a) {
    x = x * a.x % mod;
    return *this;
  }
  modint &operator/=(modint a) {
    x = x * a.inv().x % mod;
    return *this;
  }

  modint operator+(modint a) { return modint(x) += a; }
  modint operator-(modint a) { return modint(x) -= a; }
  modint operator*(modint a) { return modint(x) *= a; }
  modint operator/(modint a) { return modint(x) /= a; }

  modint operator-() { return modint(x); }

  bool operator==(const modint a) { return x == a.x; }
  bool operator<(const modint a) { return x < a.x; }
  bool operator>(const modint a) { return x > a.x; }
};

template <long long mod>
ostream &operator<<(ostream &os, const modint<mod> &a) {
  os << a.x;
  return os;
}

using mint = modint<MOD>;

mint func() {
  vector<int> line;
  {
    string str = in<string>();
    int cnt = 0;
    foreach (i, str) {
      if (i == '0') {
        if (cnt) {
          line.emplace_back(cnt);
          cnt = 0;
        }
        line.emplace_back(0);
      } else {
        ++cnt;
      }
    }
    if (cnt) {
      line.emplace_back(cnt);
    }
  }
  int n = line.size();
  int k = in();
  method(func, mint, int place, int need, int applyed) {
    if (place >= n) {
      if (need == applyed) {
        return 1;
      }
      return 0;
    }
    static vvvector<mint> dp(n, vvector<mint>(301, vector<mint>(301)));
    static vvvector<bool> used(n, vvector<bool>(301, vector<bool>(301, false)));
    mint &it = dp[place][need][applyed];
    if (used[place][need][applyed])
      return it;
    used[place][need][applyed] = true;
    it = 0;
    if (line[place]) {
      if (place + 1 < n) {
        rep(i, need + 1, min(k, 300) + 1) { it += func(place + 2, i, applyed); }
      }
      rep(i, min(need - applyed, line[place]) + 1) {
        it += func(place + 2, need, applyed + i);
      }
    } else {
      rep(i, need, min(k, 300) + 1) { it += func(place + 1, i, applyed); }
    }
    return it;
  };

  return func(0, 0, 0);
}

int main() {
  cout << func() << endl;
  return 0;
}