优先队列,主要是STL应用所以复制一下
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <map> #include <cmath> #include <cstring> #include <string> #include <queue> #include <stack> #include <cctype> #include <set> #define ALL(x) x.begin(),x.end() #define INS(x) inserter(x,x.begin()) using namespace std; const int maxn = 10005; typedef set<int>Set; map <Set,int>IDcache; vector<Set>Setcache; int ID(Set x){ if(IDcache.count(x)) return IDcache[x]; Setcache.push_back(x); return IDcache[x] = Setcache.size()-1; } int main() { #ifndef ONLINE_JUDGE freopen("in.in","r",stdin); #endif // freopen("out.out","w",stdout); stack<int>s; int t; cin >> t; while(t--){ int n; cin >> n; for(int i = 0;i < n;i++){ string op; cin >> op; if(op[0] == ‘P‘) s.push(ID(Set())); else if(op[0] == ‘D‘) s.push(s.top()); else{ Set x1 = Setcache[s.top()]; s.pop(); Set x2 = Setcache[s.top()]; s.pop(); Set x; if(op[0] == ‘U‘) set_union(ALL(x1),ALL(x2),INS(x)); ///并集 if(op[0] == ‘I‘) set_intersection(ALL(x1),ALL(x2),INS(x)); ///交集 if(op[0] == ‘A‘){ x = x2; x.insert(ID(x1)); } s.push(ID(x)); } cout << Setcache[s.top()].size() << endl; } cout << "***" << endl; } return 0; }
啊哈哈哈
时间: 2024-10-25 05:36:50