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

#include <bits/stdc++.h>
typedef int ll;
typedef unsigned long long ull;
using namespace std;
#define pb push_back
int dy[] = {0, 0, 1, -1, 1, 1, -1, -1};
int dx[] = {1, -1, 0, 0, 1, -1, -1, 1};

#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for (int i = (b)-1; i >= (a); i--)
#define REP(i, n) for (int i = 0; i < (n); i++)
#define RREP(i, n) for (int i = (n)-1; i >= 0; i--)
#define mp make_pair
#define fi first
#define INF 1000000000
#define sc second
ll n, m;

char b[600][600];

// vector<vector<ll> > dp;
ll dp[510][(1 << 20) + 10];

bool oe[600];

ll dfs(ll i) {
  if (i == n) {
    bool f = true;
    REP(j, m) {
      if (oe[j] == 1) {
        f = false;
      }
    }
    if (f) {
      return 0;
    }
    return -INF;
  }

  ll a = dfs(i + 1);

  char save[600];

  REP(j, m) { save[j] = oe[j]; }

  REP(j, m) { oe[j] = (oe[j] xor b[i][j]); }

  ll b = dfs(i + 1) + 1;

  REP(j, m) { oe[j] = save[j]; }

  return max(a, b);
}

ll dfs(ll i, ll S) {
  if (i == n) {
    if (S == 0) {
      return 0;
    }
    return -INF;
  }
  if (dp[i][S] > -INF - 100)
    return dp[i][S];

  ll a = dfs(i + 1, S);

  ll S2 = 0;
  RREP(j, m) {
    S2 *= 2;
    S2 += (((S >> j) & 1) xor b[i][j]);
  }
  ll b = dfs(i + 1, S2) + 1;
  return dp[i][S] = max(a, b);
}

int main() {
  while (true) {
    cin >> n >> m;
    if (n == 0)
      break;
    REP(i, n)
    cin >> b[i];

    REP(i, n) {
      REP(j, m) { b[i][j] -= '0'; }
    }
    if (m > 20) {
      REP(i, m) { oe[i] = 0; }
      cout << dfs(0) << endl;
    } else {
      /*dp.clear();
      REP(i,n + 10) {
              vector<ll> v;
              dp.push_back(v);
              REP(j,(1 << m) + 10)
                      dp[i].pb(-INF - 100);
      }*/
      REP(i, n + 1) {
        REP(j, (1 << m) + 1) { dp[i][j] = -INF - 100; }
      }
      cout << dfs(0, 0) << endl;
    }
  }
  return 0;
}


Error: MLE

Fixed submission:

#include <bits/stdc++.h>
typedef short ll;
typedef unsigned long long ull;
using namespace std;
#define pb push_back
int dy[] = {0, 0, 1, -1, 1, 1, -1, -1};
int dx[] = {1, -1, 0, 0, 1, -1, -1, 1};

#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for (int i = (b)-1; i >= (a); i--)
#define REP(i, n) for (int i = 0; i < (n); i++)
#define RREP(i, n) for (int i = (n)-1; i >= 0; i--)
#define mp make_pair
#define fi first
#define INF 10000
#define sc second
ll n, m;

char b[600][600];

vector<vector<ll>> dp;

bool oe[600];

ll dfs(ll i) {
  if (i == n) {
    bool f = true;
    REP(j, m) {
      if (oe[j] == 1) {
        f = false;
      }
    }
    if (f) {
      return 0;
    }
    return -INF;
  }

  ll a = dfs(i + 1);

  char save[600];

  REP(j, m) { save[j] = oe[j]; }

  REP(j, m) { oe[j] = (oe[j] xor b[i][j]); }

  ll b = dfs(i + 1) + 1;

  REP(j, m) { oe[j] = save[j]; }

  return max(a, b);
}

ll dfs(ll i, ll S) {
  if (dp[i][S] > -INF - 100)
    return dp[i][S];
  if (i == n) {
    if (S == 0) {
      return 0;
    }
    return -INF;
  }

  ll a = dfs(i + 1, S);

  ll S2 = 0;
  RREP(j, m) {
    S2 *= 2;
    S2 += (((S >> j) & 1) xor b[i][j]);
  }
  ll b = dfs(i + 1, S2) + 1;
  return dp[i][S] = max(a, b);
}

int main() {
  while (true) {
    cin >> n >> m;
    if (n == 0)
      break;
    REP(i, n)
    cin >> b[i];

    REP(i, n) {
      REP(j, m) { b[i][j] -= '0'; }
    }
    if (n < 23) {
      REP(i, m) { oe[i] = 0; }
      cout << dfs(0) << endl;
    } else {
      dp.clear();
      REP(i, n + 10) {
        vector<ll> v;
        dp.push_back(v);
        REP(j, (1 << m) + 10)
        dp[i].pb(-INF - 100);
      }
      cout << dfs(0, 0) << endl;
    }
  }
  return 0;
}