UVA - 12096:The SetStack Computer
题目描述很简单,难点在于如何对集合进行编码,因为是无限的,好像没有一个方向进行编码。
紫书给的题解十分巧妙:给新出现的集合进行编码
的确,我们没有必要为所有可能出现的集合编码后再开始,我们就可以简单的根据出现的次序分配一个映射值即可,这个值只要能够代表这个集合并且不发生碰撞。
另一个巧妙的点是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相关推荐
- 【HDU - 1968】【UVA - 12096】The SetStack Computer (模拟,集合求交集并集操作,STL实现)
题干: Background from Wikipedia: 揝et theory is a branch of mathematics created principally by the Germ ...
- 【ICPC-369】uva 12096 The SetStack Computer
点击打开链接uva 12096 思路: STL模拟 分析: 1 题目给定5种操作,每次输出栈顶集合的元素的个数 2 利用stack和set来模拟,set保存集合的元素.遇到push的时候直接在stac ...
- 12096 - The SetStack Computer
The SetStack Computer PS:因为该题排版较麻烦,这里给出OJ网址:UVa12096 - The SetStack Computer 有一个专门为了集合运算而设计的"集合 ...
- UVa12096.The SetStack Computer
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- The SetStack Computer
原题及翻译 Background from Wikipedia: "Set theory is a branch of mathematics created principally by ...
- uva计算机水平,UVA 12096 集合栈计算机
UVA 12096 集合栈计算机 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该机器有一个初始为空的栈,并且 支持以下操作. PUSH:空集"{}" ...
- UVA12096 - The SetStack Computer(set + map映射)
UVA12096 - The SetStack Computer(set + map映射) 题目链接 题目大意:有五个动作: push : 把一个空集合{}放到栈顶. dup : 把栈顶的集合取出来, ...
- UVA - 1103:Ancient Messages
Ancient Messages 来源:UVA 标签: 参考资料: 相似题目: 题目 In order to understand early civilizations, archaeologist ...
- UVA - 136:Ugly Numbers
Ugly Numbers 来源:UVA 标签: 参考资料:<算法竞赛入门经典>P120 相似题目: 题目 Ugly numbers are numbers whose only prime ...
最新文章
- 前端页面——Cookie与Session有什么区别
- 第一天写,希望能坚持下去。
- fond+html属性,JQuery 干货篇之选择元素
- js中字符替换函数String.replace()使用技巧
- 测试SAP BRF+ ruleset
- 攻击linux的samba,Samba 中间人攻击漏洞(CVE-2015-5296)
- SpringBoot三招组合拳,手把手教你打出优雅的后端接口
- 配置 BeautifulSoup
- UI完美配色专辑|色彩是影响设计使用者情绪和行为行为的最重要因素之一
- Unity C# 设计模式(五)建造者模式
- 2.SOA架构:服务和微服务分析及设计--- 理解面向服务架构
- SQL:postgresql点geom转换为经纬度、POINT
- 转载:小心别让圆角成了你列表的帧数杀手
- java定时器定时发短信_quartz-job实现实时或定时发送短信任务(示例代码)
- H265 的 CU PU TU的关系
- 表格中合并同类项并求和(物料统计) 并去除数据中的公式项
- Tackling High Dimensional Nonseparable Optimization Problems By CCPSO
- 聚播微信多开客服系统二次开发SDK服务端接口
- 基于C51的DMX512开发笔记
- 简易的网上购物商城首页设计流程
热门文章
- JAVA 框架-Spring
- python——函数 11、命名空间
- 解决express video 手机无法播放的问题
- 【线性代数公开课MIT Linear Algebra】 第二十三课 微分方程与exp(At)
- Android实例-拍摄和分享照片、分享文本(XE8+小米2)
- 数据结构与算法分析-第一章Java类(02)
- Google Maps地图投影全解析
- html的table弹窗_Js弹出基于Table的可关闭浮动层
- 复旦大学计算机学院博士生王斌,复旦大学计算机科学技术学院博士生刘鹏飞荣获...
- pdo 参数化查询 mysql函数_PDO笔记之参数化查询