题目描述很简单,难点在于如何对集合进行编码,因为是无限的,好像没有一个方向进行编码。
紫书给的题解十分巧妙:给新出现的集合进行编码
的确,我们没有必要为所有可能出现的集合编码后再开始,我们就可以简单的根据出现的次序分配一个映射值即可,这个值只要能够代表这个集合并且不发生碰撞。
另一个巧妙的点是STL中的map竟然支持从对set的哈希,这个也太神奇了,虽然不明白是怎么做的,可能要看源码才能理解。
代码如下:

需要注意的一点是在switch语句中的case语句后面不能直接声明局部变量,要放在大括号里面,形成一个局部变量。其原因是如果直接定义的话,其他case语句也是可以看到这个变量的,但是如果不执行那个定义的case语句,就会导致变量声明却没有定义。原因在于switch其实就是一种奇特的goto

#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <string>
#include <algorithm>
#include <iterator>using namespace std;
using Set = set<int>;class SetHash {vector<Set> num2set;    //保存num到set的映射map<Set, int> set2num;  //保存set到num的映射
public:int operator ()(Set s); //获取一个set的hash值Set operator ()(int num);//获取一个hash值为num的setint getSize(int num) const;
};int SetHash::operator()(Set s) {if (!set2num.count(s)) {set2num[s] = num2set.size();num2set.push_back(s);return num2set.size() - 1;} else {return set2num[s];}
}Set SetHash::operator()(int num) {return num2set[num];
}int SetHash::getSize(int num) const {return num2set[num].size();
}stack<int> stk;     //用于保存集合栈int main() {ios::sync_with_stdio(false);int T, n;string cmd;SetHash setHash;cin >> T;while (T--) {cin >> n;while (n--) {cin >> cmd;if (cmd[0] == 'P') stk.push(setHash(Set()));else if (cmd[0] == 'D') stk.push(stk.top());else {Set a = setHash(stk.top()); stk.pop();Set b = setHash(stk.top()); stk.pop();switch (cmd[0]) {case 'U':b.insert(a.begin(), a.end());stk.push(setHash(b));break;case 'I':{Set c;set_intersection(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.begin()));stk.push(setHash(c));break;}case 'A':b.insert(setHash(a));stk.push(setHash(b));break;}
//}cout << setHash.getSize(stk.top()) << "\n";}cout << "***\n";}
}

UVA - 12096:The SetStack Computer相关推荐

  1. 【HDU - 1968】【UVA - 12096】The SetStack Computer (模拟,集合求交集并集操作,STL实现)

    题干: Background from Wikipedia: 揝et theory is a branch of mathematics created principally by the Germ ...

  2. 【ICPC-369】uva 12096 The SetStack Computer

    点击打开链接uva 12096 思路: STL模拟 分析: 1 题目给定5种操作,每次输出栈顶集合的元素的个数 2 利用stack和set来模拟,set保存集合的元素.遇到push的时候直接在stac ...

  3. 12096 - The SetStack Computer

    The SetStack Computer PS:因为该题排版较麻烦,这里给出OJ网址:UVa12096 - The SetStack Computer 有一个专门为了集合运算而设计的"集合 ...

  4. UVa12096.The SetStack Computer

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. The SetStack Computer

    原题及翻译 Background from Wikipedia: "Set theory is a branch of mathematics created principally by ...

  6. uva计算机水平,UVA 12096 集合栈计算机

    UVA 12096 集合栈计算机 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该机器有一个初始为空的栈,并且 支持以下操作. PUSH:空集"{}" ...

  7. UVA12096 - The SetStack Computer(set + map映射)

    UVA12096 - The SetStack Computer(set + map映射) 题目链接 题目大意:有五个动作: push : 把一个空集合{}放到栈顶. dup : 把栈顶的集合取出来, ...

  8. UVA - 1103:Ancient Messages

    Ancient Messages 来源:UVA 标签: 参考资料: 相似题目: 题目 In order to understand early civilizations, archaeologist ...

  9. UVA - 136:Ugly Numbers

    Ugly Numbers 来源:UVA 标签: 参考资料:<算法竞赛入门经典>P120 相似题目: 题目 Ugly numbers are numbers whose only prime ...

最新文章

  1. 前端页面——Cookie与Session有什么区别
  2. 第一天写,希望能坚持下去。
  3. fond+html属性,JQuery 干货篇之选择元素
  4. js中字符替换函数String.replace()使用技巧
  5. 测试SAP BRF+ ruleset
  6. 攻击linux的samba,Samba 中间人攻击漏洞(CVE-2015-5296)
  7. SpringBoot三招组合拳,手把手教你打出优雅的后端接口
  8. 配置 BeautifulSoup
  9. UI完美配色专辑|色彩是影响设计使用者情绪和行为行为的最重要因素之一
  10. Unity C# 设计模式(五)建造者模式
  11. 2.SOA架构:服务和微服务分析及设计--- 理解面向服务架构
  12. SQL:postgresql点geom转换为经纬度、POINT
  13. 转载:小心别让圆角成了你列表的帧数杀手
  14. java定时器定时发短信_quartz-job实现实时或定时发送短信任务(示例代码)
  15. H265 的 CU PU TU的关系
  16. 表格中合并同类项并求和(物料统计) 并去除数据中的公式项
  17. Tackling High Dimensional Nonseparable Optimization Problems By CCPSO
  18. 聚播微信多开客服系统二次开发SDK服务端接口
  19. 基于C51的DMX512开发笔记
  20. 简易的网上购物商城首页设计流程

热门文章

  1. JAVA 框架-Spring
  2. python——函数 11、命名空间
  3. 解决express video 手机无法播放的问题
  4. 【线性代数公开课MIT Linear Algebra】 第二十三课 微分方程与exp(At)
  5. Android实例-拍摄和分享照片、分享文本(XE8+小米2)
  6. 数据结构与算法分析-第一章Java类(02)
  7. Google Maps地图投影全解析
  8. html的table弹窗_Js弹出基于Table的可关闭浮动层
  9. 复旦大学计算机学院博士生王斌,复旦大学计算机科学技术学院博士生刘鹏飞荣获...
  10. pdo 参数化查询 mysql函数_PDO笔记之参数化查询