解题思路:利用数字ID和集合一一对应,充分使用STL中的vector(存放集合),map(形成set和int的映射),stack(题目要求的堆栈),具体使用参见注释!
题目大意:
对于一个以集合为元素的栈,初始时栈为空。
输入的命令有如下几种:
PUSH:将空集{}压栈
DUP:将栈顶元素复制一份压入栈中
UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果压栈
INTERSECTION:先进行两次弹栈,将获得的集合A和B取交集,将结果压栈
ADD:先进行两次弹栈,将获得的集合A和B中,先出栈的集合(如A先)加入到后出栈的集合,将结果压栈
输出每一步操作后栈顶集合的元素的个数。
#include<cstdio>
#include<set>
#include<map>
#include<stack>
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
typedef set<int> Set; //定义set<int>类型
map<Set,int> IDcache; //使set<int> 和int 相互映射
vector<Set> Setcache; //存放set<int>
stack<int> Q; //以ID的形式入栈
int ID(Set x)
{
if(IDcache.count(x)) return IDcache[x]; //如果已经有了相应set的映射,直接返回其ID
else
{
Setcache.push_back(x); //把该set存入vector
return IDcache[x]=Setcache.size()-1; //以存入vector的顺序作为ID
}
}
int main()
{
int n;
cin>>n;
string s1;
while(n--)
{
cin>>s1;
if(s1[0]=='P') Q.push(ID(Set())); //存入空的Set
else if(s1[0]=='D') Q.push(Q.top());
else
{
Set x1=Setcache[Q.top()]; Q.pop();
Set x2=Setcache[Q.top()]; Q.pop();
Set x;
if(s1[0]=='U') set_union(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin())); //algorithm中的函数,最后一个参数为合成后放入的迭代器,这里放入x
if(s1[0]=='I') set_intersection(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin())); //同上,取交集
if(s1[0]=='A')
{
x=x2;
x.insert(ID(x1)); //add即是将某一个集合的ID存入另一个集合
}
Q.push(ID(x));
}
cout<<Setcache[Q.top()].size()<<endl;
}
return 0;
}