Problem p00645 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

#define dump(...) cout << "# " << #__VA_ARGS__ << '=' << (__VA_ARGS__) << endl
#define repi(i, a, b) for (int i = int(a); i < int(b); i++)
#define peri(i, a, b) for (int i = int(b); i-- > int(a);)
#define rep(i, n) repi(i, 0, n)
#define per(i, n) peri(i, 0, n)
#define all(c) begin(c), end(c)
#define mp make_pair
#define mt make_tuple

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << '(' << p.first << ',' << p.second << ')';
}

template <typename Tuple> void print_tuple(ostream &, const Tuple &) {}
template <typename Car, typename... Cdr, typename Tuple>
void print_tuple(ostream &os, const Tuple &t) {
  print_tuple<Cdr...>(os, t);
  os << (sizeof...(Cdr) ? "," : "") << get<sizeof...(Cdr)>(t);
}
template <typename... Args>
ostream &operator<<(ostream &os, const tuple<Args...> &t) {
  print_tuple<Args...>(os << '(', t);
  return os << ')';
}

template <typename Ch, typename Tr, typename C, typename = decltype(begin(C()))>
basic_ostream<Ch, Tr> &operator<<(basic_ostream<Ch, Tr> &os, const C &c) {
  os << '[';
  for (auto i = begin(c); i != end(c); ++i)
    os << (i == begin(c) ? "" : " ") << *i;
  return os << ']';
}

constexpr int INF = 1e9;
constexpr int MOD = 1e9 + 7;
constexpr double EPS = 1e-9;

int solve(int x, const vi &ms, vector<int8_t> &memo) {
  if (memo[x] != -1)
    return memo[x];

  if (x == 0)
    return memo[x] = 0;
  int res = INF;
  for (int m : ms)
    if (__builtin_ctz(x) == __builtin_ctz(m))
      res = min(res, solve(x ^ m, ms, memo));
  return memo[x] = res + 1;
}

int main() {
  vi ms;
  rep(t, 5) repi(b, t, 5) rep(l, 5) repi(r, l, 5) {
    int m = 0;
    repi(i, t, b + 1) repi(j, l, r + 1) m |= 1 << (i * 5 + j);
    ms.push_back(m);
  }
  vector<int8_t> memo(1 << 25, -1);

  for (int n; cin >> n && n;) {
    int x = 0;
    rep(i, n) rep(j, n) {
      int b;
      cin >> b;
      x |= b << (i * 5 + j);
    }

    int res = solve(x, ms, memo);
    rep(i, res) cout << string("myon");
    cout << endl;
  }
}

Error: MLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

#define dump(...) cout << "# " << #__VA_ARGS__ << '=' << (__VA_ARGS__) << endl
#define repi(i, a, b) for (int i = int(a); i < int(b); i++)
#define peri(i, a, b) for (int i = int(b); i-- > int(a);)
#define rep(i, n) repi(i, 0, n)
#define per(i, n) peri(i, 0, n)
#define all(c) begin(c), end(c)
#define mp make_pair
#define mt make_tuple

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << '(' << p.first << ',' << p.second << ')';
}

template <typename Tuple> void print_tuple(ostream &, const Tuple &) {}
template <typename Car, typename... Cdr, typename Tuple>
void print_tuple(ostream &os, const Tuple &t) {
  print_tuple<Cdr...>(os, t);
  os << (sizeof...(Cdr) ? "," : "") << get<sizeof...(Cdr)>(t);
}
template <typename... Args>
ostream &operator<<(ostream &os, const tuple<Args...> &t) {
  print_tuple<Args...>(os << '(', t);
  return os << ')';
}

template <typename Ch, typename Tr, typename C, typename = decltype(begin(C()))>
basic_ostream<Ch, Tr> &operator<<(basic_ostream<Ch, Tr> &os, const C &c) {
  os << '[';
  for (auto i = begin(c); i != end(c); ++i)
    os << (i == begin(c) ? "" : " ") << *i;
  return os << ']';
}

constexpr int INF = 1e9;
constexpr int MOD = 1e9 + 7;
constexpr double EPS = 1e-9;

int solve(int x, const vi &ms, vi &memo) {
  if (memo[x] != INF)
    return memo[x];

  if (x == 0)
    return memo[x] = 0;
  int res = INF;
  for (int m : ms)
    if (__builtin_ctz(x) == __builtin_ctz(m))
      res = min(res, solve(x ^ m, ms, memo));
  return memo[x] = res + 1;
}

int main() {
  vi ms;
  rep(t, 5) repi(b, t, 5) rep(l, 5) repi(r, l, 5) {
    int m = 0;
    repi(i, t, b + 1) repi(j, l, r + 1) m |= 1 << (i * 5 + j);
    ms.push_back(m);
  }
  vi memo(1 << 25, INF);

  for (int n; cin >> n && n;) {
    int x = 0;
    rep(i, n) rep(j, n) {
      int b;
      cin >> b;
      x |= b << (i * 5 + j);
    }

    int res = solve(x, ms, memo);
    rep(i, res) cout << string("myon");
    cout << endl;
  }
}