题意:有几种操作(如下图),然后给定一些操作,问最后栈顶的集合中有几个元素
AC代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<set>
#include<stack>
#include<map>
#include<vector>
#include<algorithm>
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin()) //插入迭代器
using namespace std;
typedef set<int> Set;
map<Set,int> IDcache; //把集合映射成ID
vector<Set> Setcache; //根据ID取集合
stack<int>s;
int ID(Set x) //查找给定集合x的ID。如果没找到,分配一个新的ID
{
if(IDcache.count(x))
return IDcache[x];
Setcache.push_back(x); //添加新集合
return IDcache[x]=Setcache.size()-1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int N;
scanf("%d",&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));
else if(op[0]=='I')
set_intersection(ALL(x1),ALL(x2),INS(x));
else
{
x=x2;
x.insert(ID(x1));
}
s.push(ID(x));
}
cout<<Setcache[s.top()].size()<<endl;
}
cout<<"***"<<endl;
}
return 0;
}