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

#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
//    #include <boost/multiprecision/cpp_int.hpp>
#include <functional>
#define int long long
#define inf 10000000000007
#define pa pair<int, int>
#define ll long long
#define pal pair<double, pa>
#define ppa pair<pa, int>
#define ppap pair<int, pa>
#define ssa pair<string, int>
#define mp make_pair
#define pb push_back
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)

using namespace std;

class Point {
public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
  }
};
typedef Point Vector;

struct Segment {
  Point p1, p2;
};
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }

bool parareru(Point a, Point b, Point c, Point d) {
  //  if(abs(cross(a-b,d-c))<EPS)cout<<"dd "<<cross(a-b,d-c)<<endl;
  return abs(cross(a - b, d - c)) < EPS;
}
double distance_ls_p(Point a, Point b, Point c) {
  if (dot(b - a, c - a) < EPS)
    return (c - a).absv();
  if (dot(a - b, c - b) < EPS)
    return (c - b).absv();
  return abs(cross(b - a, c - a)) / (b - a).absv();
}
bool is_intersected_ls(Segment a, Segment b) {
  if (a.p1 == b.p1 || a.p2 == b.p1 || a.p1 == b.p2 || a.p2 == b.p2)
    return false;
  if (parareru((a.p2), (a.p1), (a.p1), (b.p2)) &&
      parareru((a.p2), (a.p1), (a.p1), (b.p1))) {
    //      cout<<"sss"<<endl;
    if (dot(a.p1 - b.p1, a.p1 - b.p2) < EPS)
      return true;
    if (dot(a.p2 - b.p1, a.p2 - b.p2) < EPS)
      return true;
    if (dot(a.p1 - b.p1, a.p2 - b.p1) < EPS)
      return true;
    if (dot(a.p1 - b.p2, a.p2 - b.p2) < EPS)
      return true;
    return false;
  } else
    return (cross(a.p2 - a.p1, b.p1 - a.p1) * cross(a.p2 - a.p1, b.p2 - a.p1) <
            EPS) &&
           (cross(b.p2 - b.p1, a.p1 - b.p1) * cross(b.p2 - b.p1, a.p2 - b.p1) <
            EPS);
}

double segment_dis(Segment a, Segment b) {
  if (is_intersected_ls(a, b))
    return 0;
  double r = distance_ls_p(a.p1, a.p2, b.p1);
  r = min(r, distance_ls_p(a.p1, a.p2, b.p2));
  r = min(r, distance_ls_p(b.p1, b.p2, a.p2));
  r = min(r, distance_ls_p(b.p1, b.p2, a.p1));
  return r;
}
Point intersection_ls(Segment a, Segment b) {
  Point ba = b.p2 - b.p1;
  double d1 = abs(cross(ba, a.p1 - b.p1));
  double d2 = abs(cross(ba, a.p2 - b.p1));
  double t = d1 / (d1 + d2);

  return a.p1 + (a.p2 - a.p1) * t;
}

string itos(int i) {
  ostringstream s;
  s << i;
  return s.str();
}

int gcd(int v, int b) {
  if (v > b)
    return gcd(b, v);
  if (v == b)
    return b;
  if (b % v == 0)
    return v;
  return gcd(v, b % v);
}

double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
/*
int pr[100010];
//int inv[100010];
*/
int beki(int wa, int rr, int warukazu) {
  if (rr == 0)
    return 1ll;
  if (rr == 1)
    return wa % warukazu;
  if (rr % 2 == 1)
    return (beki(wa, rr - 1, warukazu) * wa) % warukazu;
  int zx = beki(wa, rr / 2, warukazu);
  return (zx * zx) % warukazu;
}
/*
void gya(){
  pr[0]=1;
  for(int i=1;i<100010;i++){
      pr[i]=(pr[i-1]*i)%inf;
  }
  for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);

}

*/
// sort(ve.begin(),ve.end(),greater<int>());
//----------------kokomade tenpure------------
// vector<double> ans(100000000),ans2(100000000);
/*
int par[200100],ranks[200100],kosuu[200100];

void shoki(int n){
    for(int i=0;i<n;i++){
        par[i]=i;
        ranks[i]=0;
        kosuu[i]=1;
    }
}

int root(int x){
    return par[x]==x ? x : par[x]=root(par[x]);
}

bool same(int x,int y){
return root(x)==root(y);
}

void unite(int x,int y){
 x=root(x);
 y=root(y);
    int xx=kosuu[x],yy=kosuu[y];
 if(x==y) return;
    if(ranks[x]<ranks[y]){
        par[x]=y;
        kosuu[y]=yy+xx;
    }
 else {
    par[y]=x;
    if(ranks[x]==ranks[y]) ranks[x]=ranks[x]+1;
    kosuu[x]=yy+xx;
 }
    return;
}
*/

string s;
int it;
vector<int> ve[5];
vector<int> V;
vector<int> ch[5];
void show(vector<int> ans) {
  bool r = false;
  // cout<<ans.size()<<endl;
  for (int i = 0; i < ans.size(); i++)
    if (ans[i]) {
      if (r)
        cout << " ";
      r = true;
      cout << V[i];
    }
  if (!r)
    cout << "NULL";
  cout << endl;
}
vector<int> U(vector<int> a1, vector<int> a2) {
  vector<int> ve1;
  for (int i = 0; i < a1.size(); i++)
    ve1.pb(a1[i] | a2[i]);
  return ve1;
}

vector<int> I(vector<int> a1, vector<int> a2) {
  vector<int> ve1;
  for (int i = 0; i < a1.size(); i++)
    ve1.pb(a1[i] & a2[i]);
  return ve1;
}
vector<int> S(vector<int> a1, vector<int> a2) {
  vector<int> ve1;
  for (int i = 0; i < a1.size(); i++)
    ve1.pb(a1[i] ^ a2[i]);
  return ve1;
}
vector<int> D(vector<int> a1, vector<int> a2) {
  vector<int> ve1;

  for (int i = 0; i < a1.size(); i++) {
    int r;
    if (a1[i] == 1 && a2[i] == 0)
      r = 1;
    else
      r = 0;
    ve1.pb(r);
  }
  return ve1;
}

vector<int> C(vector<int> a1) {
  vector<int> ve1;
  for (int i = 0; i < a1.size(); i++)
    ve1.pb(1 - a1[i]);
  return ve1;
}
vector<int> shiki();
vector<int> ka();
vector<int> han() {
  //  cout<<s[it]<<endl;
  if (s[it] == 'c') {
    //	cout<<it<<endl;
    it++;
    vector<int> e = ka();
    //	show(C(e));
    return C(e);
  } else {
    it++;
    return ch[s[it - 1] - 'A'];
  }
}

vector<int> ka() {
  if (s[it] == '(') {
    it++;
    vector<int> q = shiki();
    it++;
    return q;
  } else
    return han();
}

vector<int> shiki() {
  vector<int> r = ka();
  while (s[it] == 'u' || s[it] == 's' || s[it] == 'd' || s[it] == 'i') {
    char c = s[it];

    it++;
    vector<int> r2 = ka();

    if (c == 'u')
      r = U(r, r2);
    if (c == 's')
      r = S(r, r2);
    if (c == 'd')
      r = D(r, r2);
    if (c == 'i')
      r = I(r, r2);
  }
  //	cout<<it<<endl;
  //	show(r);
  //	cout<<r.size()<<endl;
  return r;
}

int cnt = 0;
signed main() {
  char c;
  int d;
  while (cin >> c >> d) {

    cnt++;
    //  if(cnt>19) break;

    for (int i = 0; i < d; i++) {
      int r;
      cin >> r;
      ve[c - 'A'].pb(r);
    }
    while (1) {
      cin >> c >> d;

      if (c == 'R')
        break;
      for (int i = 0; i < d; i++) {
        int r;
        cin >> r;
        ve[c - 'A'].pb(r);
      }
    }
    set<int> se;

    for (int i = 0; i < 5; i++)
      for (int j = 0; j < ve[i].size(); j++)
        se.insert(ve[i][j]);
    V.clear();
    for (auto its = se.begin(); its != se.end(); its++) {
      V.pb(*its);
    }

    for (int i = 0; i < 5; i++) {
      for (int j = 0; j < V.size(); j++) {
        bool b = false;
        for (int k = 0; k < ve[i].size(); k++) {
          if (ve[i][k] == V[j])
            b = true;
        }
        if (b)
          ch[i].pb(1);
        else
          ch[i].pb(0);
      }
      //      for(int j=0;j<V.size();j++)cout<<ch[i][j];
      //      cout<<endl;
    }
    it = 0;
    cin >> s;
    s += "*";
    vector<int> anss = shiki();
    // 	cout<<anss.size()<<endl;
    // 	return 0;
    show(anss);
    //	cout<<"s"<<endl;
    // 	return 0;

    for (int i = 0; i < 5; i++) {
      ve[i].clear();
      ch[i].clear();
    }
    V.clear();
  }

  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
//    #include <boost/multiprecision/cpp_int.hpp>
#include <functional>
#define int long long
#define inf 10000000000007
#define pa pair<int, int>
#define ll long long
#define pal pair<double, pa>
#define ppa pair<pa, int>
#define ppap pair<int, pa>
#define ssa pair<string, int>
#define mp make_pair
#define pb push_back
#define EPS (1e-10)
#define equals(a, b) (fabs((a) - (b)) < EPS)

using namespace std;

class Point {
public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double a) { return Point(x * a, y * a); }
  Point operator/(double a) { return Point(x / a, y / a); }
  double absv() { return sqrt(norm()); }
  double norm() { return x * x + y * y; }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point &p) const {
    return fabs(x - p.x) < EPS && fabs(y - p.y) < EPS;
  }
};
typedef Point Vector;

struct Segment {
  Point p1, p2;
};
double dot(Vector a, Vector b) { return a.x * b.x + a.y * b.y; }
double cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }

bool parareru(Point a, Point b, Point c, Point d) {
  //  if(abs(cross(a-b,d-c))<EPS)cout<<"dd "<<cross(a-b,d-c)<<endl;
  return abs(cross(a - b, d - c)) < EPS;
}
double distance_ls_p(Point a, Point b, Point c) {
  if (dot(b - a, c - a) < EPS)
    return (c - a).absv();
  if (dot(a - b, c - b) < EPS)
    return (c - b).absv();
  return abs(cross(b - a, c - a)) / (b - a).absv();
}
bool is_intersected_ls(Segment a, Segment b) {
  if (a.p1 == b.p1 || a.p2 == b.p1 || a.p1 == b.p2 || a.p2 == b.p2)
    return false;
  if (parareru((a.p2), (a.p1), (a.p1), (b.p2)) &&
      parareru((a.p2), (a.p1), (a.p1), (b.p1))) {
    //      cout<<"sss"<<endl;
    if (dot(a.p1 - b.p1, a.p1 - b.p2) < EPS)
      return true;
    if (dot(a.p2 - b.p1, a.p2 - b.p2) < EPS)
      return true;
    if (dot(a.p1 - b.p1, a.p2 - b.p1) < EPS)
      return true;
    if (dot(a.p1 - b.p2, a.p2 - b.p2) < EPS)
      return true;
    return false;
  } else
    return (cross(a.p2 - a.p1, b.p1 - a.p1) * cross(a.p2 - a.p1, b.p2 - a.p1) <
            EPS) &&
           (cross(b.p2 - b.p1, a.p1 - b.p1) * cross(b.p2 - b.p1, a.p2 - b.p1) <
            EPS);
}

double segment_dis(Segment a, Segment b) {
  if (is_intersected_ls(a, b))
    return 0;
  double r = distance_ls_p(a.p1, a.p2, b.p1);
  r = min(r, distance_ls_p(a.p1, a.p2, b.p2));
  r = min(r, distance_ls_p(b.p1, b.p2, a.p2));
  r = min(r, distance_ls_p(b.p1, b.p2, a.p1));
  return r;
}
Point intersection_ls(Segment a, Segment b) {
  Point ba = b.p2 - b.p1;
  double d1 = abs(cross(ba, a.p1 - b.p1));
  double d2 = abs(cross(ba, a.p2 - b.p1));
  double t = d1 / (d1 + d2);

  return a.p1 + (a.p2 - a.p1) * t;
}

string itos(int i) {
  ostringstream s;
  s << i;
  return s.str();
}

int gcd(int v, int b) {
  if (v > b)
    return gcd(b, v);
  if (v == b)
    return b;
  if (b % v == 0)
    return v;
  return gcd(v, b % v);
}

double distans(double x1, double y1, double x2, double y2) {
  double rr = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
  return sqrt(rr);
}
/*
int pr[100010];
//int inv[100010];
*/
int beki(int wa, int rr, int warukazu) {
  if (rr == 0)
    return 1ll;
  if (rr == 1)
    return wa % warukazu;
  if (rr % 2 == 1)
    return (beki(wa, rr - 1, warukazu) * wa) % warukazu;
  int zx = beki(wa, rr / 2, warukazu);
  return (zx * zx) % warukazu;
}
/*
void gya(){
  pr[0]=1;
  for(int i=1;i<100010;i++){
      pr[i]=(pr[i-1]*i)%inf;
  }
  for(int i=0;i<100010;i++) inv[i]=beki(pr[i],inf-2);

}

*/
// sort(ve.begin(),ve.end(),greater<int>());
//----------------kokomade tenpure------------
// vector<double> ans(100000000),ans2(100000000);
/*
int par[200100],ranks[200100],kosuu[200100];

void shoki(int n){
    for(int i=0;i<n;i++){
        par[i]=i;
        ranks[i]=0;
        kosuu[i]=1;
    }
}

int root(int x){
    return par[x]==x ? x : par[x]=root(par[x]);
}

bool same(int x,int y){
return root(x)==root(y);
}

void unite(int x,int y){
 x=root(x);
 y=root(y);
    int xx=kosuu[x],yy=kosuu[y];
 if(x==y) return;
    if(ranks[x]<ranks[y]){
        par[x]=y;
        kosuu[y]=yy+xx;
    }
 else {
    par[y]=x;
    if(ranks[x]==ranks[y]) ranks[x]=ranks[x]+1;
    kosuu[x]=yy+xx;
 }
    return;
}
*/

string s;
int it;
vector<int> ve[5];
vector<int> V;
vector<int> ch[5];

vector<int> U(vector<int> a1, vector<int> a2) {
  vector<int> ve;
  for (int i = 0; i < a1.size(); i++)
    ve.pb(a1[i] | a2[i]);
  return ve;
}

vector<int> I(vector<int> a1, vector<int> a2) {
  vector<int> ve;
  for (int i = 0; i < a1.size(); i++)
    ve.pb(a1[i] & a2[i]);
  return ve;
}
vector<int> S(vector<int> a1, vector<int> a2) {
  vector<int> ve;
  for (int i = 0; i < a1.size(); i++)
    ve.pb(a1[i] ^ a2[i]);
  return ve;
}
vector<int> D(vector<int> a1, vector<int> a2) {
  vector<int> ve;

  for (int i = 0; i < a1.size(); i++) {
    int r;
    if (a1[i] == 1 && a2[i] == 0)
      r = 1;
    else
      r = 0;
    ve.pb(r);
  }
  return ve;
}

vector<int> C(vector<int> a1) {
  vector<int> ve;
  for (int i = 0; i < a1.size(); i++)
    ve.pb(1 - a1[i]);
  return ve;
}
vector<int> shiki();
vector<int> ka();
vector<int> han() {
  //  cout<<s[it]<<endl;
  if (s[it] == 'c') {
    it++;
    vector<int> e = ka();
    return C(e);
  } else {
    it++;
    return ch[s[it - 1] - 'A'];
  }
}

vector<int> ka() {
  if (s[it] == '(') {
    it++;
    vector<int> q = shiki();
    it++;
    return q;
  } else
    return han();
}

vector<int> shiki() {
  vector<int> r = ka();
  while (s[it] == 'u' || s[it] == 's' || s[it] == 'd' || s[it] == 'i') {
    char c = s[it];
    it++;
    vector<int> r2 = ka();

    if (c == 'u')
      r = U(r, r2);
    if (c == 's')
      r = S(r, r2);
    if (c == 'd')
      r = D(r, r2);
    if (c == 'i')
      r = I(r, r2);
  }
  return r;
}

int cnt = 0;
signed main() {
  char c;
  int d;
  while (1) {

    cnt++;
    //  if(cnt>20) break;

    while (1) {
      cin >> c >> d;

      if (c == 'R')
        break;
      for (int i = 0; i < d; i++) {
        int r;
        cin >> r;
        ve[c - 'A'].pb(r);
      }
    }
    set<int> se;

    for (int i = 0; i < 5; i++)
      for (int j = 0; j < ve[i].size(); j++)
        se.insert(ve[i][j]);
    V.clear();
    for (auto its = se.begin(); its != se.end(); its++) {
      V.pb(*its);
    }

    for (int i = 0; i < 5; i++) {
      for (int j = 0; j < V.size(); j++) {
        bool b = false;
        for (int k = 0; k < ve[i].size(); k++) {
          if (ve[i][k] == V[j])
            b = true;
        }
        if (b)
          ch[i].pb(1);
        else
          ch[i].pb(0);
      }
      //      for(int j=0;j<V.size();j++)cout<<ch[i][j];
      //      cout<<endl;
    }
    it = 0;
    cin >> s;
    s += "*";
    vector<int> ans = shiki();
    bool r = false;
    for (int i = 0; i < ans.size(); i++)
      if (ans[i])
        r = true, cout << V[i] << " ";
    if (!r)
      cout << "NULL";
    cout << endl;
  }

  return 0;
}