题目链接

有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且
支持以下操作。

  • PUSH:空集“{}”入栈。
  • DUP:把当前栈顶元素复制一份后再入栈。
  • UNION:出栈两个集合,然后把二者的并集入栈。
  • INTERSECT:出栈两个集合,然后把二者的交集入栈。
  • ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈。

每次操作后,输出栈顶集合的大小(即元素个数)。例如,栈顶元素是A={{},
{{}}},下一个元素是B={{},{{{}}}},则:

  • UNION操作将得到{{},{{}},{{{}}}},输出3。
  • INTERSECT操作将得到{{}},输出1。
  • ADD操作将得到{{},{{{}}},{{},{{}}}},输出3。

输入不超过2000个操作,并且保证操作均能顺利进行(不需要对空栈执行出栈操作)。
【分析】
本题的集合并不是简单的整数集合或者字符串集合,而是集合的集合。为了方便起见,此处为每个不同的集合分配一个唯一的ID,则每个集合都可以表示成所包含元素的ID集合,这样就可以用STL的set<int>来表示了,而整个栈则是一个stack<int>。

#include<iostream>
#include<string>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())typedef set<int> Set;
map<Set,int> IDcache; // 把集合映射成ID
vector<Set> Setcache; // 根据ID取集合// 查找给定集合x的ID。如果找不到,分配一个新ID
int ID (Set x) {if (IDcache.count(x)) return IDcache[x];Setcache.push_back(x); // 添加新集合return IDcache[x] = Setcache.size() - 1;
}int main () {int T;cin >> T;while(T--) {stack<int> s; // 题目中的栈int n;cin >> n;for(int i = 0; i < n; i++) {string op;cin >> op;if (op[0] == 'P') s.push(ID(Set()));else if (op[0] == 'D') s.push(s.top());else {Set x1 = Setcache[s.top()]; s.pop();Set x2 = Setcache[s.top()]; s.pop();Set x;if (op[0] == 'U') set_union (ALL(x1), ALL(x2), INS(x));if (op[0] == 'I') set_intersection (ALL(x1), ALL(x2), INS(x));if (op[0] == 'A') { x = x2; x.insert(ID(x1)); }s.push(ID(x));}      cout << Setcache[s.top()].size() << endl;}cout << "***" << endl;}return 0;
}

The SetStack Computer UVA - 12096 集合栈计算机 set集合相关推荐

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

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

  2. 解题报告——例题5-5 集合栈计算机 UVa12096

    五个操作: 1.PUSH:空集{}入栈 2.DUP:当前栈顶元素复制一份在入栈 3.UNION:出栈两个集合,然后把二者的并集入栈 4.INTERSECT:出栈两个元素,然后把二者的交集入栈 5.AD ...

  3. 12096 - The SetStack Computer

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

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

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

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

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

  6. UVA - 12096:The SetStack Computer

    题目描述很简单,难点在于如何对集合进行编码,因为是无限的,好像没有一个方向进行编码. 紫书给的题解十分巧妙:给新出现的集合进行编码 的确,我们没有必要为所有可能出现的集合编码后再开始,我们就可以简单的 ...

  7. The SetStack Computer

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

  8. UVa12096.The SetStack Computer

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

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

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

最新文章

  1. 飞书与IAI国际广告奖,协同实现国内营销史上的创新“云终审”
  2. electron 利用 electron-builder实现自动更新
  3. DBA(七):PXC、MySQL存储引擎
  4. 96. 奇怪的汉诺塔【递推】
  5. 为什么要采购订单而不采购库存?
  6. dynamips模拟器模块详细介绍
  7. 【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列
  8. react --- 按需加载组件
  9. 解密Arm Neoverse V1 和 Neoverse N2 平台 为下一代基础设施带来计算变革
  10. 旅游景点人流量代码php,用 PHP 爬虫做旅游数据分析
  11. php传递参数给asp.net,asp.net 传值总结
  12. POJ 2983 Is the Information Reliable?(差分约束系统)
  13. MetaMask/metamask-extension/mascara 的运行实现
  14. Eclipse下载安装配置
  15. 2017年是晚立秋,“秋老虎”来袭!
  16. 2 年前端面试心路历程(字节跳动、YY、虎牙、BIGO)
  17. python输入一个正整数、计算其各个位的数字之和_C语言程序设计:编写程序,输入一个正整数,统计该整数的位数并计算其各个数位上的数字之和。...
  18. 农业种植大数据平台构建
  19. 虚拟机安装centeros7镜像
  20. 测试 RAM 盘和 DISK 盘的文件读写速度

热门文章

  1. pycharm IDEA专业版2016.3.2版本和 python3.5.0 win7 64位安装包 百度云资源共享 及安装和编辑器注册图录
  2. 阿里云的应用(day02)
  3. 助力工业物联网,工业大数据项目介绍及环境构建【一、二】
  4. 用AI说再见!“辣眼睛”的买家秀 1
  5. Android压缩图片到100K以下并保持不失真的高效方法
  6. warning C4183: ‘Cricle‘: member function definition looks like a ctor, but name does not match enclo
  7. Java多线程-任务拒绝策略
  8. [2020.1.10]systemd介绍
  9. oc实时渲染的图如何导出_如何使用C4D制作逼真的循环三维动画
  10. 二维数组的花式遍历技巧盘点