算法习题---5.5集合栈计算机(Uva12096)*****
一:题目
- 对于一个以集合为元素的栈,初始时栈为空。
- 输入的命令有如下几种:
- PUSH:将空集{}压栈
- DUP:将栈顶元素复制一份压入栈中
- UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果压栈
- INTERSECTION:先进行两次弹栈,将获得的集合A和B取交集,将结果压栈
- ADD:先进行两次弹栈,将获得的集合A和B中,先出栈的集合(如A先)加入到后出栈的集合,将结果压栈
- 输出每一步操作后栈顶集合的元素的个数。
(一)样例输入
- PUSH
- DUP
- ADD
- PUSH
- ADD
- DUP
- ADD
- DUP
- UNION
- PUSH
- PUSH
- ADD
- PUSH
- INTERSECT
(二)样例输出
- ***
- ***
二:代码实现
(一)知识前提STL补充--set集合相等判断
(二)代码实现
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <map>
- #include <vector>
- #include <set>
- #include <stack>
- #include <string>
- #include <algorithm>
- using namespace std;
- typedef set<int> Set;
- vector<Set> Vec_Set_ID; //辅助获取集合对应ID号,其中每次只往里面添加新的集合
- map<Set, int> Map_Set; //集合对应集合标识号,同上面vector,向其中添加新的集合和集合号
- stack<int> Sta; //集合号栈
- int GetIDForSet(Set s)
- {
- int number;
- if (Map_Set.count(s)) //如果直接找到了编号,则直接返回集合编号
- return Map_Set[s];
- //若是没有找到集合标号,先将该集合放入容器中之后获取编号
- Vec_Set_ID.push_back(s);
- number = Vec_Set_ID.size() - 1; //重点:每个集合和其对应的编号与下标一致,方便寻找
- Map_Set.insert(pair<Set, int>(s, number));
- return number;
- }
- int main()
- {
- freopen("data5_5.in", "r", stdin);
- freopen("data5_5.out", "w", stdout);
- int count,oper_c;
- string cmd;
- cin >> count;
- while (count--)
- {
- cin >> oper_c;
- while (oper_c--)
- {
- cin >> cmd;
- //开始处理
- if (cmd[] == 'P') //入空集合
- Sta.push(GetIDForSet(Set()));
- else if (cmd[] == 'D') //栈顶集合复制一份入栈
- Sta.push(Sta.top());
- else
- {
- Set s;
- Set s1 = Vec_Set_ID[Sta.top()]; Sta.pop();
- Set s2 = Vec_Set_ID[Sta.top()]; Sta.pop();
- if (cmd[] == 'U') //出栈两个集合将其并集入栈
- set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s, s.begin()));
- else if (cmd[] == 'I')
- set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s, s.begin()));
- else if (cmd[] == 'A')
- {
- s2.insert(GetIDForSet(s1));
- s = s2;
- }
- //进行插入栈中
- Sta.push(GetIDForSet(s));
- }
- //输出每一步栈顶集合的大小
- cout << Vec_Set_ID[Sta.top()].size() << endl;
- }
- cout << "***" << endl;
- }
- freopen("CON", "r", stdin);
- freopen("CON", "w", stdout);
- return ;
- }
算法习题---5.5集合栈计算机(Uva12096)*****的更多相关文章
- 集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096)
集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096) 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该 ...
- UVA12096 集合栈计算机(map和vector实现双射关系+集合的交并运算的STL)
题目大意: 对于一个以集合为元素的栈,初始时栈为空. 输入的命令有如下几种: PUSH:将空集{}压栈 DUP:将栈顶元素复制一份压入栈中 UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果 ...
- 5_5 集合栈计算机(UVa12096)<stack与STL其他容器的综合运用>
有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始化为空的栈,并支持以下操作:( 维护 N(1≤N≤2000) 个操作, 可能的五种操作如下:) ■PUSH: 在栈顶加入一个空集合 A= ...
- stack 集合栈计算机 (摘)
有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入 ...
- UVa - 12096 集合栈计算机(STL)
[题意] 有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两 ...
- 集合栈计算机(UVa12096)
题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...
- 集合栈计算机 (The SetStack Computer,ACM/ICPC NWERC 2006,UVa12096
题目描述: #include<iostream> #include<string> #include<set> #include<map> #inclu ...
- uva 12096 - The SetStack Computer(集合栈)
例题5-5 集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096) 有一个专门为了集合运算而设计的"集合栈"计算机. ...
- C语言算法系列---1.队列和栈
写在前面:在家玩了好久,实在是不知道干嘛了,突然想找些事做,现在是时候做些什么了.这些东西不见得多高深,也可能很简单,但很基础,也无法忽视.同时,也是自己学习走过的一条路. 这是开头,就写写C的队列和 ...
随机推荐
- jemeter 查看结果树 分析
查看结果树,可以看到测试通过,通过 的测试通常为绿色.红色则代表失败了.可以查看到取样器结果,请求,响应数据 取样器结果中可以查看到响应头,响应数据大小,响应时间等信息. Thread Name: 线 ...
- test20190803 夏令营NOIP训练19
60+100+0=160 贪婪大陆 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败--人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前 ...
- unsupervised learning: K-means 算法
k-means算法是目前最流行的,用得最多的一种clustering算法 K-means算法 如果我们想要将上图中的绿色的点分为两类,首先随机的选取两个cluster centroids(聚类中心), ...
- [Flutter] Custom a Slider with SliderTheme
SliderTheme( data: SliderTheme.of(context).copyWith( activeTrackColor: Colors.white, inactiveTrackCo ...
- asp.net MVC 使用wifidog 协议实现wifi认证
在网上看到的很多实现的wifidog 协议一般都是PHP 的,了解一下PHP 但是比较喜欢.net ,所以实现了简单的一个进行登录认证的功能 (好多协议中的功能目前没有实现) 1. 开发环境(vs20 ...
- AtCoder Grand Contest 010题解
传送门 \(A\) 判一下奇数的个数就行了 const int N=1e5+5; int a[N],n,res; int main(){ scanf("%d",&n); f ...
- Three.js中的div标签跟随(模型弹框)
目录 Three.js中的div标签跟随(模型弹框) 参考官方案例 核心渲染器 用法 注意事项 Three.js中的div标签跟随(模型弹框) 参考官方案例 核心渲染器 three.js-master ...
- TCP的几个知识点
1. 三次握手.四次挥手 详细查看:https://www.cnblogs.com/amiezhang/p/6703390.html 2. ARQ 协议 ARQ 就是超时重传机制,分为 2 种:停止等 ...
- 用vue做的购物车结算的功能
<!-- 占位 --> <template> <div> <div class="product_table"> <div c ...
- css,js 学习记录
记录一些自己曾经阅读,值得收藏的网址 --(css3新特性) https://segmentfault.com/a/1190000010780991#articleHeader41 --CSS3 3D ...