Problem p01104 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char *argv[]) {
  for (;;) {
    int n, m;
    cin >> n >> m;
    if (n == 0 && m == 0)
      break;
    vector<vector<bool>> bs;
    for (int i = 0; i < n; i++) {
      string str;
      cin >> str;
      vector<bool> v;
      for (int j = 0; j < m; j++) {
        v.push_back(str[j] == '1');
      }
      bs.push_back(move(v));
    }
    if (n < m) { // recipie < stuff  -> all possible combinations of recipes!
      const int nn = 1 << n;
      int mxc = 0;
      for (int i = 0; i < nn; i++) {
        vector<bool> ss(m, false);
        int c = 0;
        for (int j = 1, ii = 0; j < nn; j <<= 1, ii++) {
          if (i & j) {
            c++;
            for (int k = 0; k < m; k++) {
              ss[k] = ss[k] ^ bs[ii][k];
            }
          }
        }
        bool ng = false;
        for (int k = 0; k < m; k++) {
          if (ss[k]) {
            ng = true;
            break;
          }
        }
        if (!ng) {
          if (mxc < c)
            mxc = c;
        }
      }
      cout << mxc << endl;
    } else { // recipie >= stuff  -> all possible states of odd stuff
      const int mm = 1 << m;
      vector<int> ms;
      for (int i = 0; i < n; i++) {
        int msk = 0;
        for (int j = 1, ii = 0; j < mm; j <<= 1, ii++) {
          if (bs[i][ii])
            msk |= j;
        }
        ms.push_back(msk);
      }
      vector<int> ss(mm, -1);
      ss[0] = 0;
      for (int i = 0; i < n; i++) { // using recipe i.
        vector<int> tt(mm, -1);
        for (int j = 0; j < mm; j++) {
          if (ss[j] < 0)
            continue;
          if (tt[j] < ss[j])
            tt[j] = ss[j];
          int k = j ^ ms[i];
          if (tt[k] < ss[j] + 1) {
            tt[k] = ss[j] + 1;
          }
        }
        ss = move(tt);
      }
      cout << ss[0] << endl;
    }
  }
  return 0;
}

Fixed submission:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char *argv[]) {
  for (;;) {
    int n, m;
    cin >> n >> m;
    if (n == 0 && m == 0)
      break;
    vector<vector<bool>> bs;
    for (int i = 0; i < n; i++) {
      string str;
      cin >> str;
      vector<bool> v;
      for (int j = 0; j < m; j++) {
        v.push_back(str[j] == '1');
      }
      bs.push_back(move(v));
    }
    if (n <= 20) { // recipie < stuff  -> all possible combinations of recipes!
      const int nn = 1 << n;
      int mxc = 0;
      for (int i = 0; i < nn; i++) {
        vector<bool> ss(m, false);
        int c = 0;
        for (int j = 1, ii = 0; j < nn; j <<= 1, ii++) {
          if (i & j) {
            c++;
            for (int k = 0; k < m; k++) {
              ss[k] = ss[k] ^ bs[ii][k];
            }
          }
        }
        bool ng = false;
        for (int k = 0; k < m; k++) {
          if (ss[k]) {
            ng = true;
            break;
          }
        }
        if (!ng) {
          if (mxc < c)
            mxc = c;
        }
      }
      cout << mxc << endl;
    } else { // recipie >= stuff  -> all possible states of odd stuff
      const int mm = 1 << m;
      vector<int> ms;
      for (int i = 0; i < n; i++) {
        int msk = 0;
        for (int j = 1, ii = 0; j < mm; j <<= 1, ii++) {
          if (bs[i][ii])
            msk |= j;
        }
        ms.push_back(msk);
      }
      vector<int> ss(mm, -1);
      ss[0] = 0;
      for (int i = 0; i < n; i++) { // using recipe i.
        vector<int> tt(mm, -1);
        for (int j = 0; j < mm; j++) {
          if (ss[j] < 0)
            continue;
          if (tt[j] < ss[j])
            tt[j] = ss[j];
          int k = j ^ ms[i];
          if (tt[k] < ss[j] + 1) {
            tt[k] = ss[j] + 1;
          }
        }
        ss = move(tt);
      }
      cout << ss[0] << endl;
    }
  }
  return 0;
}