为每种不同的集合创建ID,用map和vector将集合与ID绑定
#include <bits/stdc++.h>
using namespace std;
map<set<int>,int>setmap;
vector<set<int> >setvec;
stack<int>s;
int getid(set<int> x)//查找id,如果没有则创建新id
{
if(setmap.count(x))return setmap[x];
setvec.push_back(x);
return setmap[x]=setvec.size()-1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
while(!s.empty())s.pop();
int n;
cin>>n;
while(n--)
{
string s1;
cin>>s1;
if(s1=="PUSH")s.push(getid(set<int>()));
else if(s1=="DUP")s.push(s.top());
else
{
set<int>a=setvec[s.top()];
s.pop();
set<int>b=setvec[s.top()];
s.pop();
set<int>c;
if(s1=="UNION")set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.end()));//并集
else if(s1=="INTERSECT")
set_intersection(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.end()));//交集
else if(s1=="ADD")
{
int x=getid(a);
b.insert(x);
c=b;
}
int id=getid(c);
s.push(id);
}
cout<<setvec[s.top()].size()<<endl;;
}
cout<<"***"<<endl;
}
return 0;
}