#include<bits/stdc++.h>
using namespace std;
typedef set<int> Set;//简化类型,后面使用更简便
map<Set,int> IDcache;
vector<Set> Setcache;
#define ALL(x) x.begin(),x.end()//宏定义简化使用函数过程的参数,后面代码用到的时候写法简便
#define INS(x) inserter(x,x.begin())
int ID(Set x)
{ if(IDcache.count(x)) return IDcache[x];//map中已有x这个集合,返回对应的值
Setcache.push_back(x);//没有这个集合,将这个插入vector中
return IDcache[x]=Setcache.size()-1;//将集合存入map里,并将对应的值赋值在vector中的下标
}
main()
{ stack<int> s;
int n;
cin>>n;
for(int i=0;i<n;i++)
{ string op;
cin>>op;
if(op[0]=='p') s.push(ID(Set()));// 判断为什么操作 s.push表示入栈
else if(op[0]=='D') s.push(s.top());//
else
{ Set x1=Setcache[s.top()]; s.pop(); //定义x1为第一个集合 s.pop()移除栈顶元素,定义之后要清除重新赋值
Set x2=Setcache[s.top()]; s.pop();//定义x2为第二个集合
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));// x1的ID插入到x中
}
s.push(ID(x));//合并后的x存入map中,ID放入vector
}
}
cout<<Setcache[s.top()].size()<<endl;
}
记事本
取两集合并集: set_union()
取两集合交集: set_intersection()
取第一集合对第二集合的差集:;set_difference()
要包含头文件algorithm
empty()堆栈为空,则返回true。
pop()移除栈顶元素。
push()在栈顶增加元素。
size()返回栈中元素数目。
top()返回栈顶元素。