题意:给出一个空的栈,支持集合的操作,求每次操作后,栈顶集合的元素个数
从紫书给的例子
A={{},{{}}}
B={{},{{{}}}}
A是栈顶元素,A是一个集合,同时作为一个集合的A,它自身里面也可以集合套集合
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 #define mod=1e9+7; 12 #define ALL(x) x.begin(),x.end() 13 #define INS(x) inserter(x,x.begin()) 14 using namespace std; 15 16 typedef long long LL; 17 typedef set<int> Set; 18 map<Set,int> IDcache;//每一个集合对应有一个ID编号 19 vector<Set> Setcache;//根据每个集合的ID编号找到对应的集合 20 21 22 23 int ID(Set x){ 24 if(IDcache.count(x)) return IDcache[x];//查找给定集合的编号,找到了,则返回编号 25 Setcache.push_back(x);//没有找到,则新建一个 26 return IDcache[x]=Setcache.size()-1; 27 } 28 29 int main(){ 30 int n,kase; 31 cin>>kase; 32 while(kase--){ 33 cin>>n; 34 stack<int > s; 35 for(int i=0;i<n;i++){ 36 string op; 37 cin>>op; 38 if(op[0]=='P') s.push(ID(Set())); 39 else if(op[0]=='D') s.push(s.top()); 40 else{ 41 Set x1=Setcache[s.top()];s.pop(); 42 Set x2=Setcache[s.top()];s.pop(); 43 Set x; 44 if(op[0]=='U') set_union(ALL(x1),ALL(x2),INS(x));//set_union求两个集合的并集 45 if(op[0]=='I') set_intersection(ALL(x1),ALL(x2),INS(x));//set_intersection求两个集合的交集 46 if(op[0]=='A') {x=x2;x.insert(ID(x1));} 47 s.push(ID(x)); 48 } 49 cout<<Setcache[s.top()].size()<<endl; 50 } 51 cout<<"***"<<" "; 52 } 53 return 0; 54 }
话说这一题目是之前看的了,但是当时始终不理解add操作
,后来看紫书的例子每一个栈里的元素是一个集合,集合又可以套集合,add操作就好理解一些了 就像是这幅插图一样