Problem p01104 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <bits/stdc++.h>

#define REP(i, n) for (int i = 0; i < n; i++)
#define ALL(obj) obj.begin(), obj.end()
#define fcout cout << setprecision(10)

const int iINF = 1e9;
const long long llINF = 1e18;
const int MOD = 1e9 + 7;

using namespace std;

template <typename T> void debug(vector<T> &vec) {
  for (auto x : vec) {
    cout << x << " ";
  }
  cout << endl;
  return;
}

template <typename A, size_t N, typename T>
void FILL(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}

template <typename T> int getFormer(const vector<T> &vec, T x) {
  return upper_bound(vec.begin(), vec.end(), x) - vec.begin() - 1;
}

template <typename T> int getLatter(const vector<T> &vec, T x) {
  return lower_bound(vec.begin(), vec.end(), x) - vec.begin();
}

int n, m, b[510], dp[2][(1 << 25)];
string s[510];
bool odd[510];
void solve(int n, int m) {
  FILL(b, 0);
  for (int i = 0; i < n; i++) {
    cin >> s[i];
    for (int j = 0; j < m; j++) {
      if (s[i][j] == '0')
        continue;
      b[i] |= (1 << j);
    }
  }

  if (n <= 20) {
    int ans = 0;
    for (int S = 0; S < (1 << n); S++) {
      FILL(odd, false);
      int cnt = 0;
      for (int i = 0; i < n; i++) {
        if ((S >> i) & 1) {
          for (int j = 0; j < m; j++) {
            if (s[i][j] == '0')
              continue;
            odd[j] = !odd[j];
          }
          cnt += 1;
        }
      }

      if (accumulate(odd, odd + m, 0))
        continue;
      ans = max(ans, cnt);
    }

    cout << ans << endl;
  } else {
    FILL(dp, -1);
    dp[0][0] = 0;
    int ans = 0;
    for (int i = 0; i < n; i++) {
      int now = i % 2;
      for (int S = 0; S < (1 << m); S++) {
        if (dp[now][S] == -1)
          continue;
        int next = S ^ b[i];
        dp[now ^ 1][S] = max(dp[now ^ 1][S], dp[now][S]);
        dp[now ^ 1][next] = max(dp[now ^ 1][next], dp[now][S] + 1);
        if (next == 0)
          ans = max(ans, dp[now ^ 1][next]);
        if (S == 0)
          ans = max(ans, dp[now ^ 1][S]);
      }
      for (int S = 0; S < (1 << m); S++) {
        dp[now][S] = -1;
      }
    }

    cout << ans << endl;
  }
}

int main() {
  int n, m;
  while (cin >> n >> m && n) {
    solve(n, m);
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>

#define REP(i, n) for (int i = 0; i < n; i++)
#define ALL(obj) obj.begin(), obj.end()
#define fcout cout << setprecision(10)

const int iINF = 1e9;
const long long llINF = 1e18;
const int MOD = 1e9 + 7;

using namespace std;

template <typename T> void debug(vector<T> &vec) {
  for (auto x : vec) {
    cout << x << " ";
  }
  cout << endl;
  return;
}

template <typename A, size_t N, typename T>
void FILL(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}

template <typename T> int getFormer(const vector<T> &vec, T x) {
  return upper_bound(vec.begin(), vec.end(), x) - vec.begin() - 1;
}

template <typename T> int getLatter(const vector<T> &vec, T x) {
  return lower_bound(vec.begin(), vec.end(), x) - vec.begin();
}

int n, m, b[510], dp[2][(1 << 23)];
string s[510];
bool odd[510];
void solve(int n, int m) {
  FILL(b, 0);
  for (int i = 0; i < n; i++) {
    cin >> s[i];
    for (int j = 0; j < m; j++) {
      if (s[i][j] == '0')
        continue;
      b[i] |= (1 << j);
    }
  }

  if (n <= 20) {
    int ans = 0;
    for (int S = 0; S < (1 << n); S++) {
      FILL(odd, false);
      int cnt = 0;
      for (int i = 0; i < n; i++) {
        if ((S >> i) & 1) {
          for (int j = 0; j < m; j++) {
            if (s[i][j] == '0')
              continue;
            odd[j] = !odd[j];
          }
          cnt += 1;
        }
      }

      if (accumulate(odd, odd + m, 0))
        continue;
      ans = max(ans, cnt);
    }

    cout << ans << endl;
  } else {
    FILL(dp, -1);
    dp[0][0] = 0;
    int ans = 0;
    for (int i = 0; i < n; i++) {
      int now = i % 2;
      for (int S = 0; S < (1 << m); S++) {
        if (dp[now][S] == -1)
          continue;
        int next = S ^ b[i];
        dp[now ^ 1][S] = max(dp[now ^ 1][S], dp[now][S]);
        dp[now ^ 1][next] = max(dp[now ^ 1][next], dp[now][S] + 1);
        if (next == 0)
          ans = max(ans, dp[now ^ 1][next]);
        if (S == 0)
          ans = max(ans, dp[now ^ 1][S]);
      }
      for (int S = 0; S < (1 << m); S++) {
        dp[now][S] = -1;
      }
    }

    cout << ans << endl;
  }
}

int main() {
  int n, m;
  while (cin >> n >> m && n) {
    solve(n, m);
  }
  return 0;
}