UVa 12096 The SetStack Computer【STL】

题意:给出一个空的栈,支持集合的操作,求每次操作后,栈顶集合的元素个数

从紫书给的例子

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<<"***"<<"\n";        
52     }
53     return 0;
54 }
View Code

 

 

 

 

 

话说这一题目是之前看的了,但是当时始终不理解add操作

,后来看紫书的例子每一个栈里的元素是一个集合,集合又可以套集合,add操作就好理解一些了 就像是这幅插图一样

posted @ 2015-03-22 21:21  sequenceaa  阅读(136)  评论(0编辑  收藏  举报