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

#include "bits/stdc++.h"
using namespace std;
typedef long long int lint;
typedef pair<lint, lint> plint;
typedef pair<double long, double long> pld;
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((lint)(x).size())
#define POW2(n) (1LL << (n))
#define FOR(i, begin, end)                                                     \\
  for (lint i = (begin), i##_end_ = (end); i < i##_end_; i++)
#define IFOR(i, begin, end)                                                    \\
  for (lint i = (end)-1, i##_begin_ = (begin); i >= i##_begin_; i--)
#define REP(i, n) FOR(i, 0, n)
#define IREP(i, n) IFOR(i, 0, n)
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first + r.first, l.second + r.second);
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first - r.first, l.second - r.second);
}
const lint MOD = 1e9 + 7, INF = 1e18;
const double eps = 1e-8;

set<lint> ablest;

lint T, N, A;
vector<lint> arr;
string s;

int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  cin >> T;
  REP(i, T) {
    arr.clear();
    ablest.clear();
    ablest.insert(0);
    cin >> N;
    REP(j, N) {
      cin >> A;
      arr.push_back(A);
    }
    cin >> s;
    bool flag = true;
    lint prev = 0;
    vector<lint> basis;
    IREP(j, N) {
      for (auto base : basis) {
        chmin(arr[j], arr[j] ^ base);
      }
      if (arr[j]) {
        if (s[j] == '0') {
          basis.push_back(arr[j]);
        } else {
          flag = false;
        }
      }
    }
    if (flag)
      cout << 0 << endl;
    else
      cout << 1 << endl;
  }
}


Error: TLE

Fixed submission:

#include "bits/stdc++.h"
using namespace std;
typedef long long int lint;
typedef pair<lint, lint> plint;
typedef pair<double long, double long> pld;
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((lint)(x).size())
#define POW2(n) (1LL << (n))
#define FOR(i, begin, end)                                                     \\
  for (lint i = (begin), i##_end_ = (end); i < i##_end_; i++)
#define IFOR(i, begin, end)                                                    \\
  for (lint i = (end)-1, i##_begin_ = (begin); i >= i##_begin_; i--)
#define REP(i, n) FOR(i, 0, n)
#define IREP(i, n) IFOR(i, 0, n)
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first + r.first, l.second + r.second);
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2> &l, const pair<T1, T2> &r) {
  return make_pair(l.first - r.first, l.second - r.second);
}
const lint MOD = 1e9 + 7, INF = 1e18;

set<lint> ablest;

lint T, N, A;
vector<lint> arr;
string s;

int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  cin >> T;
  REP(i, T) {
    arr.clear();
    ablest.clear();
    ablest.insert(0);
    cin >> N;
    REP(i, N) {
      cin >> A;
      arr.push_back(A);
    }
    cin >> s;
    bool flag = true;
    IREP(i, N) {
      if (s[i] == '0') {
        set<lint> inst;
        for (auto itr : ablest) {
          inst.insert(itr ^ arr[i]);
        }
        for (auto itr : inst) {
          ablest.insert(itr);
        }
      } else {
        if (ablest.find(arr[i]) == ablest.end()) {
          flag = false;
          break;
        }
      }
    }
    if (flag)
      cout << 0 << endl;
    else
      cout << 1 << endl;
  }
}