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

题干:

Background from Wikipedia: 揝et theory is a branch of mathematics created principally by the German mathematician Georg Cantor at the end of the 19th century. Initially controversial, set theory has come to play the role of a foundational theory in modern mathematics, in the sense of a theory invoked to justify assumptions made inmathematics concerning the existence of mathematical objects (such as numbers or functions) and their properties. Formal versions of set theory also have a foundational role to play as specifying a theoretical ideal of mathematical rigor in proofs.?Given this importance of sets, being the basis of mathematics, a set of eccentric theorist set off to construct a supercomputer operating on sets instead of numbers. The initial Set-Stack Alpha is under construction, and they need you to simulate it in order to verify the operation of the prototype. 

 

The computer operates on a single stack of sets, which is initially empty. After each operation, the cardinality of the topmost set on the stack is output. The cardinality of a set S is denoted |S| and is the number of elements in S. The instruction set of the SetStack Alpha is PUSH, DUP, UNION, INTERSECT, and ADD. 
?PUSH will push the empty set {} on the stack. 
?DUP will duplicate the topmost set (pop the stack, and then push that set on the stack twice). 
?UNION will pop the stack twice and then push the union of the two sets on the stack. 
?INTERSECT will pop the stack twice and then push the intersection of the two sets on the stack. 
?ADD will pop the stack twice, add the first set to the second one, and then push the resulting set on the stack. 
For illustration purposes, assume that the topmost element of the stack is A = {{}, {{}}} and that the next one is B = {{}, {{{}}}}. 
For these sets, we have |A| = 2 and |B| = 2. Then: 
?UNION would result in the set { {}, {{}}, {{{}}} }. The output is 3. 
?INTERSECT would result in the set { {} }. The output is 1. 
?ADD would result in the set { {}, {{{}}}, {{},{{}}} }. The output is 3. 

Input

An integer 0 <= T <= 5 on the first line gives the cardinality of the set of test cases. The first line of each test case contains the number of operations 0 <= N <= 2 000. Then follow N lines each containing one of the five commands. It is guaranteed that the SetStack computer can execute all the commands in the sequence without ever popping an empty stack.

Output

For each operation specified in the input, there will be one line of output consisting of a single integer. This integer is the cardinality of the topmost element of the stack after the corresponding command has executed. After each test case there will be a line with *** (three asterisks).

Sample Input

2
9
PUSH
DUP
ADD
PUSH
ADD
DUP
ADD
DUP
UNION
5
PUSH
PUSH
ADD
PUSH
INTERSECT

Sample Output

0
0
1
0
1
1
2
2
2
***
0
0
1
0
0
***

题目大意:集合的运算
有5种操作:

PUSH: 空集“{}”入栈。

DUP:把当前栈顶元素复制一份后再入栈。

UNION:出栈两个集合,然后把二者的并集入栈。

INTERSECT:出栈两个集合,然后把二者的交集入栈

ADD:出栈两个集合,然后把先出栈的加入到后出栈的集合中,把结果入栈。

每次操作后输出栈顶集合的大小。

解题报告:

     是集合的集合,为了表示不同的集合,可用一个整型ID表示,比如说用1表示{},集合{{}}就表示成{1},再用2作为其ID。于是题目就成了编码问题,对每个新生成的集合,我们判断该集合是否出现过,若未出现过,就给他分配一个新的ID,出现过的用已有的ID表示。所有集合用map表示集合与ID的对应关系,用一个队列存集合,以便根据ID去集合。

于竞赛,这种题目还是不太可能碰到的、、于学习C++这门语言与掌握STL,这倒是个不错的题目。

对于那个置空,我们可以用C++中类的概念解释,写成if(op[0] == 'P') sk.push(getid(kong)); 或者因为我们知道他一定是1,所以也可以直接sk.push( 1 );

AC代码:(795ms)

#include<bits/stdc++.h>using namespace std;
int top;
map<set<int>,int> s_i;
map<int,set<int> > i_s;
int getid(set<int> s) {if(s_i.find(s) != s_i.end()) return s_i[s];s_i[s] = ++top;i_s[top] = s;return top;
}int main()
{
//	freopen("in.txt","r",stdin);int t,m;char op[10];set<int> kong,st1,st2,st;kong.clear();cin>>t;while(t--) {top = 0;s_i.clear();i_s.clear();stack<int> sk;scanf("%d",&m);while(m--) {scanf("%s",op);if(op[0] == 'P') sk.push(getid(kong)); else if(op[0] == 'D') sk.push(sk.top());else {st1 = i_s[sk.top()];sk.pop();st2 = i_s[sk.top()];sk.pop();st.clear();//这一句必须加上,不然就waif(op[0] == 'U') {set_union(st1.begin(),st1.end(),st2.begin(),st2.end(),inserter(st,st.begin()));}else if(op[0] == 'I') set_intersection(st1.begin(),st1.end(),st2.begin(),st2.end(),inserter(st,st.begin()));else {st2.insert(getid(st1));st = st2;}sk.push(getid(st));}printf("%d\n",i_s[sk.top()].size());}printf("***\n");}return 0 ;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

info testing mysql_SQLMASQLMAP中文说明(linux版本)

这个东西&#xff0c;是mickey整理的&#xff0c;不多说了&#xff0c;尊重一下原作者&#xff0c;转载注明mickey整理就好了更新svn checkout https://svn.sqlmap.org/sqlmap/trunk/sqlmap sqlmap-devsqlmap.py -u "http://www.islamichina.com/hotelinchina.asp?cityid…

关于C++里面使用set_union,set_intersections、set_merge、set_difference、set_symmetric_difference等函数的使用总结

set里面有set_intersection&#xff08;取集合交集&#xff09;、set_union&#xff08;取集合并集&#xff09;、set_difference&#xff08;取集合差集&#xff09;、set_symmetric_difference&#xff08;取集合对称差集&#xff09;等函数。其中&#xff0c;关于函数的五个…

java mouseenter_关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别

最近在做的在线考试和课程商城都遇到这样的问题&#xff1a;就是鼠标滑过的时候出现一个层&#xff0c;当鼠标滑到当前层的话mouseover和mouseout在低版本的浏览器会出现闪动的现象&#xff0c;解决这个现象的办法有许多&#xff0c;不过我觉得有一种是最简单的那就是把mouseov…

【HDU - 1465 】不容易系列之一 (组合数学,错排)

题干&#xff1a; 大家常常感慨&#xff0c;要做好一件事情真的不容易&#xff0c;确实&#xff0c;失败比成功容易多了&#xff01; 做好“一件”事情尚且不易&#xff0c;若想永远成功而总从不失败&#xff0c;那更是难上加难了&#xff0c;就像花钱总是比挣钱容易的道理一…

java gc回收机制种类_JAVA的垃圾回收机制(GC)

1.什么是垃圾回收&#xff1f;垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。2.什么时候垃圾回收&#xff1f;System.gc()Runtime.getRuntime().gc()上面的方法调用时用于显式通知…

【HDU - 4217 】Data Structure? (线段树求第k小数)

题干&#xff1a; Data structure is one of the basic skills for Computer Science students, which is a particular way of storing and organizing data in a computer so that it can be used efficiently. Today let me introduce a data-structure-like problem for y…

java redis 重连_突破Java面试(23-4) - Redis 复制原理

全是干货的技术号&#xff1a;本文已收录在github&#xff0c;欢迎 star/fork&#xff1a;在Redis复制的基础上(不包括Redis Cluster或Redis Sentinel作为附加层提供的高可用功能)&#xff0c;使用和配置主从复制非常简单&#xff0c;能使得从 Redis 服务器(下文称 slave)能精确…

【HDU - 4006】The kth great number (优先队列,求第k大的数)

题干&#xff1a; Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to write down a number, or ask Xiao Bao what the kth great number is. Because the number written by Xiao Ming is too much, Xiao Bao is feeling giddy…

java获取u盘_实例分享java监听u盘的方法

package org.load.u;import java.io.File;import java.util.LinkedHashMap;import java.util.Map;// U盘检测public class CheckU {// 存放磁盘状态private static Map map new LinkedHashMap();// 定义磁盘private static final String[] arr new String[] {"C", …

【POJ - 1562】Oil Deposits (dfs搜索,连通块问题)

题干&#xff1a; The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It …

python列表浅复制_Python列表深浅复制详解

转自&#xff1a;https://www.cnblogs.com/blaomao/p/7239203.html在文章《Python 数据类型》里边介绍了列表的用法&#xff0c;其中列表有个 copy() 方法&#xff0c;意思是复制一个相同的列表。例如1 names ["小明", "小红", "小黑", "小…

【HYSBZ - 1192】鬼谷子的钱袋(水题,二进制)

题干&#xff1a; 鬼谷子非常聪明&#xff0c;正因为这样&#xff0c;他非常繁忙&#xff0c;经常有各诸侯车的特派员前来向他咨询时政。有一天&#xff0c;他在咸阳游历的时候&#xff0c;朋友告诉他在咸阳最大的拍卖行&#xff08;聚宝商行&#xff09;将要举行一场拍卖会&a…

【CodeForces - 735B】Urbanization (找规律,思维)

题干&#xff1a; Local authorities have heard a lot about combinatorial abilities of Ostap Bender so they decided to ask his help in the question of urbanization. There are n people who plan to move to the cities. The wealth of the i of them is equal to a…

java 文本查找_Java基于正则表达式实现查找匹配的文本功能【经典实例】

本文实例讲述了Java基于正则表达式实现查找匹配的文本功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;REMatch.java&#xff1a;package reMatch;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** Created by Frank*/public class REMatch {p…

【51nod - 1073】约瑟夫环问题模板

题干&#xff1a; N个人坐成一个圆环&#xff08;编号为1 - N&#xff09;&#xff0c;从第1个人开始报数&#xff0c;数到K的人出列&#xff0c;后面的人重新从1开始报数。问最后剩下的人的编号。 例如&#xff1a;N 3&#xff0c;K 2。2号先出列&#xff0c;然后是1号&am…

java oracle database user dsn_跨会话序列化数据库连接

我正在开发一个web应用程序&#xff0c;它需要使用最终用户提供的凭据登录到数据库&#xff1b;应用程序本身没有登录到数据库。在问题是如何为每个用户会话创建一个连接。在一种方法是&#xff1a;请求用户凭据检查针对数据库后端的凭据是否有效在会话级变量中存储凭据这种方法…

【POJ - 3125 】Printer Queue(模拟,队列+优先队列,STL)

题干&#xff1a; The only printer in the computer science students union is experiencing an extremely heavy workload. Sometimes there are a hundred jobs in the printer queue and you may have to wait for hours to get a single page of output. Because some …

java循环单链表类构造函数_C++实现双向循环链表

本文实例为大家分享了C实现双向循环链表的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下一、概念1.在双链表中的每个结点应有两个链接指针&#xff1a;lLink -> 指向前驱结点 (前驱指针或者左链指针)rLink->指向后继结点(后驱指针或者右链指针)2.双链表常采用…

*【CodeForces - 799C】Fountains (线段树 或 树状数组,类似二元组问题)

题干&#xff1a; Arkady plays Gardenscapes a lot. Arkady wants to build two new fountains. There are n available fountains, for each fountain its beauty and cost are known. There are two types of money in the game: coins and diamonds, so each fountain cos…

java 前后的区别_java中前后++的区别

java中前后的区别发布时间&#xff1a;2020-06-22 14:38:22来源&#xff1a;亿速云阅读&#xff1a;134作者&#xff1a;Leah这篇文章将为大家详细讲解有关java中前后的区别&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家做个参考&#xff0c;希望大家阅读完这篇文章…