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

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <complex>
#include <cstdio>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

// common
typedef long long i64, ll;

#define BR "\\n"
#define ALL(c) (c).begin(), (c).end()
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)
#define FOR(i, l, r) for (int i = (l); i < (int)(r); ++i)
#define EACH(it, o) for (auto it = (o).begin(); it != (o).end(); ++it)
#define IN(l, v, r) ((l) <= (v) && (v) < (r))

// debug
#ifdef NDEBUG
#define DUMP(x)
#define DUMPLN(x)
#define DEBUG(x)
#define DEBUGLN(x)
#define LINE()
#define LINELN()
#define CHECK(exp, act)
#define STOP(e)
#else
#define DUMP(x) cerr << #x << " = " << (x)
#define DUMPLN(x) DUMP(x) << endl
#define DEBUG(x) DUMP(x) << LINE() << " " << __FILE__
#define DEBUGLN(x) DEBUG(x) << endl
#define LINE() cerr << " (L" << __LINE__ << ")"
#define LINELN() LINE() << endl
#define CHECK(exp, act)                                                        \\
  if (exp != act) {                                                            \\
    DUMPLN(exp);                                                               \\
    DEBUGLN(act);                                                              \\
  }
#define STOP(e)                                                                \\
  CHECK(e, true);                                                              \\
  if (!(e))                                                                    \\
    exit(1);
#endif

template <class T> inline string toString(const vector<T> &x) {
  stringstream ss;
  REP(i, x.size()) {
    if (i != 0)
      ss << " ";
    ss << x[i];
  }
  return ss.str();
}

template <class T> inline string toString(const vector<vector<T>> &map) {
  stringstream ss;
  REP(i, map.size()) {
    if (i != 0)
      ss << BR;
    ss << toString(map[i]);
  }
  return ss.str();
}
template <class K, class V> string toString(map<K, V> &x) {
  string res;
  stringstream ss;
  for (auto &p : x)
    ss << p.first << ":" << p.second << " ";
  return ss.str();
}

string BITtoString(int bit) {
  stringstream ss;
  while (bit != 0) {
    ss << (bit % 2);
    bit /= 2;
  }
  string res = ss.str();
  reverse(ALL(res));
  return res;
}

template <typename T, typename V> inline T pmod(T v, V MOD) {
  return (v % MOD + MOD) % MOD;
}

int INF = 1 << 28;

int dp[1 << 16], ndp[1 << 16];
class Main {
public:
  void run() {
    while (true) {
      int n, c;
      cin >> n >> c;
      if (n == 0 && c == 0)
        break;
      vector<int> as(n, 0);
      REP(y, n) REP(i, 16) {
        int v;
        cin >> v;
        as[y] += v << i;
      }
      vector<int> bs(c + 1, 0);
      REP(y, c) REP(i, 16) {
        int v;
        cin >> v;
        bs[y] += v << i;
      }

      // 残ってる光
      vector<vector<int>> score(c + 1, vector<int>(1 << 16));
      REP(y, c + 1) REP(bit, 1 << 16) {
        int bitc = 0;
        REP(i, 16) if (((bs[y] & bit) >> i) & 1) bitc++;
        score[y][bit] = bitc;
      }
      REP(bit, 1 << 16) dp[bit] = ndp[bit] = -INF;
      dp[0] = 0;

      REP(y1, n) {
        // 更新
        REP(bit, 1 << 16) if (dp[bit] != -INF) {
          // on
          int nbit = as[y1] | bit;

          // touch
          REP(y2, c + 1) {
            int nnbit = nbit & ~bs[y2];
            ndp[nnbit] = max(ndp[nnbit], dp[bit] + score[y2][nbit]);
          }
        }

        // next
        REP(bit, 1 << 16) dp[bit] = ndp[bit];
      }

      int Mv = 0;
      REP(bit, 1 << 16) Mv = max(Mv, dp[bit]);
      cout << Mv << endl;
    }
  }
};

int main() {
  // ios::sync_with_stdio(false);
  Main().run();
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <complex>
#include <cstdio>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

// common
typedef long long i64, ll;

#define BR "\\n"
#define ALL(c) (c).begin(), (c).end()
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)
#define FOR(i, l, r) for (int i = (l); i < (int)(r); ++i)
#define EACH(it, o) for (auto it = (o).begin(); it != (o).end(); ++it)
#define IN(l, v, r) ((l) <= (v) && (v) < (r))

// debug
#ifdef NDEBUG
#define DUMP(x)
#define DUMPLN(x)
#define DEBUG(x)
#define DEBUGLN(x)
#define LINE()
#define LINELN()
#define CHECK(exp, act)
#define STOP(e)
#else
#define DUMP(x) cerr << #x << " = " << (x)
#define DUMPLN(x) DUMP(x) << endl
#define DEBUG(x) DUMP(x) << LINE() << " " << __FILE__
#define DEBUGLN(x) DEBUG(x) << endl
#define LINE() cerr << " (L" << __LINE__ << ")"
#define LINELN() LINE() << endl
#define CHECK(exp, act)                                                        \\
  if (exp != act) {                                                            \\
    DUMPLN(exp);                                                               \\
    DEBUGLN(act);                                                              \\
  }
#define STOP(e)                                                                \\
  CHECK(e, true);                                                              \\
  if (!(e))                                                                    \\
    exit(1);
#endif

template <class T> inline string toString(const vector<T> &x) {
  stringstream ss;
  REP(i, x.size()) {
    if (i != 0)
      ss << " ";
    ss << x[i];
  }
  return ss.str();
}

template <class T> inline string toString(const vector<vector<T>> &map) {
  stringstream ss;
  REP(i, map.size()) {
    if (i != 0)
      ss << BR;
    ss << toString(map[i]);
  }
  return ss.str();
}
template <class K, class V> string toString(map<K, V> &x) {
  string res;
  stringstream ss;
  for (auto &p : x)
    ss << p.first << ":" << p.second << " ";
  return ss.str();
}

string BITtoString(int bit) {
  stringstream ss;
  while (bit != 0) {
    ss << (bit % 2);
    bit /= 2;
  }
  string res = ss.str();
  reverse(ALL(res));
  return res;
}

template <typename T, typename V> inline T pmod(T v, V MOD) {
  return (v % MOD + MOD) % MOD;
}

int INF = 1 << 28;

class Main {
public:
  void run() {
    while (true) {
      int n, c;
      cin >> n >> c;
      if (n == 0 && c == 0)
        break;
      vector<int> as(n, 0);
      REP(y, n) REP(i, 16) {
        int v;
        cin >> v;
        as[y] += v << i;
      }
      vector<int> bs(c + 1, 0);
      REP(y, c) REP(i, 16) {
        int v;
        cin >> v;
        bs[y] += v << i;
      }

      // 残ってる光
      vector<vector<int>> score(c + 1, vector<int>(1 << 16));
      REP(y, c + 1) REP(bit, 1 << 16) {
        int bitc = 0;
        REP(i, 16) if (((bs[y] & bit) >> i) & 1) bitc++;
        score[y][bit] = bitc;
      }

      vector<int> dp(1 << 16, -INF), ndp(1 << 16, -INF);
      dp[0] = 0;

      REP(y1, n) {
        // 更新
        REP(bit, 1 << 16) {
          // on
          int nbit = as[y1] | bit;

          // touch
          REP(y2, c + 1) {
            int nnbit = nbit & ~bs[y2];
            ndp[nnbit] = max(ndp[nnbit], dp[bit] + score[y2][nbit]);
          }
        }

        // next
        REP(bit, 1 << 16) dp[bit] = ndp[bit];
      }

      int Mv = 0;
      REP(bit, 1 << 16) Mv = max(Mv, dp[bit]);
      cout << Mv << endl;
    }
  }
};

int main() {
  // ios::sync_with_stdio(false);
  Main().run();
  return 0;
}