The SetStack Computer UVA - 12096
记录一下不管做几次都不会写的题
考察:STL+hash
第一次做完全是地铁老人看手机,第二次做基本默写lnj的代码还只能想起思路,本蒟蒻属实fw
正确思路:
因为要输出栈顶集合的size,所以不能拿两个int做键和值.需要将set映射为int,而对应int我们也要能获得相应的集合.这里用到了hash的思想.可以用map和vector作为映射和反映射.
往这复习STL的交并补GO
这里复习插入迭代器GO
1 #include <iostream> 2 #include <stack> 3 #include <set> 4 #include <map> 5 #include <unordered_map> 6 #include <algorithm> 7 using namespace std; 8 vector<set<int> > mp;//unordered_map貌似不能用STL做键 9 map<set<int>,int> rmp; 10 int Getid(set<int> s) 11 { 12 if(!rmp.count(s)) rmp[s] = mp.size(),mp.push_back(s); 13 return rmp[s]; 14 } 15 int main() 16 { 17 //freopen("in.txt","r",stdin); 18 //freopen("out.txt","w",stdout); 19 int T,n; 20 scanf("%d",&T); 21 while(T--) 22 { 23 stack<int> stk; mp.clear(); rmp.clear(); 24 scanf("%d",&n); 25 char op[10]; 26 while(n--) 27 { 28 scanf("%s",op); 29 if(op[0]=='P') { set<int> s;stk.push(Getid(s)); } 30 else if(op[0]=='D') stk.push(stk.top()); 31 else{ 32 set<int> res; 33 set<int> a = mp[stk.top()]; stk.pop(); 34 set<int> b = mp[stk.top()]; stk.pop(); 35 if(op[0]=='U') 36 { 37 set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(res,res.begin())); 38 int id = Getid(res); 39 stk.push(id); 40 }else if(op[0]=='I') 41 { 42 set_intersection(a.begin(),a.end(),b.begin(),b.end(),inserter(res,res.begin())); 43 int id =Getid(res); 44 stk.push(id); 45 }else{ 46 b.insert(rmp[a]); 47 int x = Getid(b); 48 stk.push(x); 49 } 50 } 51 printf("%d\n",mp[stk.top()].size()); 52 } 53 printf("***\n"); 54 } 55 return 0; 56 }