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

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cstdio>
#include <cstring>
#include <deque>
#include <iostream>
#include <vector>

using namespace std;
int n, m;
string s[501];
int dp[2][1 << 24];
// t=100?????????0????????¨,
// t=101?????????0??¨2????????¨
int N = -1;
bool tmp[501];
bool s2[501][501];
int s3[501]; //??¬???????????¶???????????´??°?????????????????????
int dfs(int h, string t) { // h????????±???,t????????¨????????¬??????
  if (h == n) {
    // cout<<t<<endl;
    int cnt = 0;
    // for(int i=0;i<m;i++)tmp[i]=0;
    memset(tmp, 0, sizeof tmp);

    for (int i = 0; i < n; i++) {
      bool f = t[i] - '0';
      if (f == 1) { //?????¨????????¬????????????

        for (int j = 0; j < m; j++)
          tmp[j] = tmp[j] ^ s2[i][j];
        // tmp^=s2[i];
        cnt++;
      }
    }

    for (int i = 0; i < m; i++)
      if (tmp[i])
        return 0;
    // for(int i=0;i<m;i++)cout<<tmp[i];cout<<" "<<t<<" "<<cnt<<endl;
    return cnt;
  }

  return max(dfs(h + 1, t + "1"), dfs(h + 1, t + "0"));
}

int twoToTen(string x) {
  int sum = 0;
  int xs = x.size();
  for (int i = xs; i >= 0; i--) {
    if (x[i] - '0' == 1)
      sum += 1 << (xs - i - 1);
  }
  return sum;
}

int dpp() {
  // for(int i=0;i<(1<<m);i++)
  // dp[0][i]=dp[1][i]=N;
  memset(dp[0], -1, sizeof dp[0]);
  memset(dp[1], -1, sizeof dp[1]);

  dp[0][0] = 0;

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 1 << m; j++) {
      if ((i + 1) % 2 == 1) {
        if (dp[0][j] != N) {
          // cout<<i<<" "<<j<<"A"<<endl;
          int now = twoToTen(
              s[i]); //????????¬????????????10????????§?????????????????????
          dp[1][j ^ now] = max(dp[1][j ^ now], dp[0][j] + 1);
          dp[1][j] = max(dp[1][j], dp[0][j]);
        }

      } else {
        if (dp[1][j] != N) {
          // cout<<i<<" "<<j<<"A"<<endl;
          int now = twoToTen(
              s[i]); //????????¬????????????10????????§?????????????????????
          dp[0][j ^ now] = max(dp[0][j ^ now], dp[1][j] + 1);
          dp[0][j] = max(dp[0][j], dp[1][j]);
        }
      }
    }
  }

  return dp[n % 2][0];
}

int main() {
  while (cin >> n >> m, n || m) {

    for (int i = 0; i < n; i++)
      cin >> s[i];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++)
        s2[i][j] = s[i][j] - '0';
    }
    // for(int i=0;i<n;i++)s3[i]=twoToTen(s[i]);

    if (n <= 21)
      cout << dfs(0, "") << endl;
    else
      cout << dpp() << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cstdio>
#include <cstring>
#include <deque>
#include <iostream>
#include <vector>

using namespace std;
int n, m;
string s[501];
int dp[2][1 << 23];
// t=100?????????0????????¨,
// t=101?????????0??¨2????????¨
int N = -1;
bool tmp[501];
bool s2[501][501];
int s3[501]; //??¬???????????¶???????????´??°?????????????????????
int dfs(int h, string t) { // h????????±???,t????????¨????????¬??????
  if (h == n) {
    // cout<<t<<endl;
    int cnt = 0;
    // for(int i=0;i<m;i++)tmp[i]=0;
    memset(tmp, 0, sizeof tmp);

    for (int i = 0; i < n; i++) {
      bool f = t[i] - '0';
      if (f == 1) { //?????¨????????¬????????????

        for (int j = 0; j < m; j++)
          tmp[j] = tmp[j] ^ s2[i][j];
        // tmp^=s2[i];
        cnt++;
      }
    }

    for (int i = 0; i < m; i++)
      if (tmp[i])
        return 0;
    // for(int i=0;i<m;i++)cout<<tmp[i];cout<<" "<<t<<" "<<cnt<<endl;
    return cnt;
  }

  return max(dfs(h + 1, t + "1"), dfs(h + 1, t + "0"));
}

int twoToTen(string x) {
  int sum = 0;
  int xs = x.size();
  for (int i = xs; i >= 0; i--) {
    if (x[i] - '0' == 1)
      sum += 1 << (xs - i - 1);
  }
  return sum;
}

int dpp() {
  // for(int i=0;i<(1<<m);i++)
  // dp[0][i]=dp[1][i]=N;
  memset(dp[0], -1, sizeof dp[0]);
  memset(dp[1], -1, sizeof dp[1]);

  dp[0][0] = 0;

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 1 << m; j++) {
      if ((i + 1) % 2 == 1) {
        if (dp[0][j] != N) {
          // cout<<i<<" "<<j<<"A"<<endl;
          int now = twoToTen(
              s[i]); //????????¬????????????10????????§?????????????????????
          dp[1][j ^ now] = max(dp[1][j ^ now], dp[0][j] + 1);
          dp[1][j] = max(dp[1][j], dp[0][j]);
        }

      } else {
        if (dp[1][j] != N) {
          // cout<<i<<" "<<j<<"A"<<endl;
          int now = twoToTen(
              s[i]); //????????¬????????????10????????§?????????????????????
          dp[0][j ^ now] = max(dp[0][j ^ now], dp[1][j] + 1);
          dp[0][j] = max(dp[0][j], dp[1][j]);
        }
      }
    }
  }

  return dp[n % 2][0];
}

int main() {
  while (cin >> n >> m, n || m) {

    for (int i = 0; i < n; i++)
      cin >> s[i];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++)
        s2[i][j] = s[i][j] - '0';
    }
    for (int i = 0; i < n; i++)
      s3[i] = twoToTen(s[i]);

    if (n <= 22)
      cout << dfs(0, "") << endl;
    else
      cout << dpp() << endl;
  }
  return 0;
}