题目大意:

对于一个以集合为元素的栈,初始时栈为空。

输入的命令有如下几种:

PUSH:将空集{}压栈

DUP:将栈顶元素复制一份压入栈中

UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果压栈

INTERSECTION:先进行两次弹栈,将获得的集合A和B取交集,将结果压栈

ADD:先进行两次弹栈,将获得的集合A和B中,先出栈的集合(如A先)加入到后出栈的集合,将结果压栈

输出每一步操作后栈顶集合的元素的个数。

题目详细信息见传送门

思路如下:

对于集合的集合,我们很难直接表示,因此,我们可以换一种想法,既然集合的集合难以表示,我们就只需要给每种集合一个唯一的ID就可以了,这样,集合中的元素就可以通过ID来表示。一个集合就可以表示为一个set<int>

在这里,我们使用STL中的set进行表示,就会容易很多,加入栈中的元素也就可以是int类型了。

在进行操作时,我们可以用map将每种集合与对应的ID关联起来,这样做既可以完成查找ID的任务,还可以同时判定是否出现了新的集合。

我们可以用vector作为存储每种集合的cache,这样,每当map中没有相应的ID时,我们就向vector中加入一个set<int>元素,并将下标作为ID进行唯一的标识。

使用vector将set存储起来的好处是,反过来我们也可以用ID查询到对应的set,这样,通过map和vector,我们实现了set 到ID 的双射。

最后,输出栈顶集合的size属性,即可。

代码如下:

     //UVA12096 集合栈计算机
#include<cstdio>
#include<iostream>
#include<algorithm>//set_union等函数定义在这里
#include<vector>
#include<set>
#include<map>
#include<stack> #define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin()) //注意宏的括号和inserter using namespace std; typedef set<int> Set;
map<Set,int> IDCache;
vector<Set> setCache;
int t,n;
char cmd[];
int getID(Set s){
if(IDCache.count(s))return IDCache[s];
setCache.push_back(s); //将新集合加入Setcache
return IDCache[s]=setCache.size()-;//将ID加入map ,同时返回新分配的ID值
} int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
// setCache.clear();
stack<int> s;
while(n--){
scanf(" %s",&cmd);
if(cmd[]=='P')s.push(getID(Set()));
else if(cmd[]=='D')s.push(s.top());
else{
Set s1=setCache[s.top()];s.pop();
Set s2=setCache[s.top()];s.pop();
Set x;
if(cmd[]=='U')set_union(ALL(s1),ALL(s2),INS(x));
if(cmd[]=='I')set_intersection(ALL(s1),ALL(s2),INS(x));
if(cmd[]=='A'){ x=s2; x.insert(getID(s1)); }
s.push(getID(x));
}
printf("%d\n",setCache[s.top()].size());
}
puts("***");
}
}

注意:

  第30行的setCache.clear()是必须注释掉的,因为如果存在这一句,那么vector就会清空,但是对应的map却没有清空,就会出现wa的情况。

  从另一个角度说,只需要map和vector始终保持一致那么set和ID 的双射关系就不会发生改变,此时我们就不需要将map和vector清空,因为不影响后续操作的结果。

UVA12096 集合栈计算机(map和vector实现双射关系+集合的交并运算的STL)的更多相关文章

  1. 集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096)

    集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096) 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该 ...

  2. 5_5 集合栈计算机(UVa12096)<stack与STL其他容器的综合运用>

    有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始化为空的栈,并支持以下操作:( 维护 N(1≤N≤2000) 个操作, 可能的五种操作如下:) ■PUSH: 在栈顶加入一个空集合 A= ...

  3. stack 集合栈计算机 (摘)

    有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入 ...

  4. UVa - 12096 集合栈计算机(STL)

    [题意] 有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两 ...

  5. 算法习题---5.5集合栈计算机(Uva12096)*****

    一:题目 对于一个以集合为元素的栈,初始时栈为空. 输入的命令有如下几种: PUSH:将空集{}压栈 DUP:将栈顶元素复制一份压入栈中 UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果压 ...

  6. 集合栈计算机(UVa12096)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...

  7. 集合栈计算机 (The SetStack Computer,ACM/ICPC NWERC 2006,UVa12096

    题目描述: #include<iostream> #include<string> #include<set> #include<map> #inclu ...

  8. uva 12096 - The SetStack Computer(集合栈)

    例题5-5 集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096) 有一个专门为了集合运算而设计的"集合栈"计算机. ...

  9. Python全栈开发记录_第四篇(集合、函数等知识点)

    知识点1:深拷贝和浅拷贝 非拷贝(=赋值:数据完全共享,内存地址一样,修改一个另一个也变化) 浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层)像[[1,2],3,4]如果修改列表中列 ...

随机推荐

  1. NIO Q&A(持续补充。。。。)

    Q:NIO是非阻塞的.但调用的selector.select()方法会阻塞.这和NIO非阻塞岂不是矛盾了? A:非阻塞指的是 IO 事件本身不阻塞,但是获取 IO 事件的 select 方法是需要阻塞 ...

  2. POJ——2449 Remmarguts' Date

    Description "Good man never makes girls wait or breaks an appointment!" said the mandarin ...

  3. Git 删除服务器的远程分支

    git push origin :分支名 可能会出现,在A机子操作,刷新下成功删除,但在B机子上还显示,再用下命令提示不存在该分支,只要再推送一个任意分支即可正常显示

  4. nginx,docker反向代理

    1. [root@javanginx ~]# cat /etc/nginx/nginx.conf user root root;worker_processes 4;error_log /var/lo ...

  5. PHP 抽象类,接口,抽象方法,静态方法

    1.Abstract class(抽象类) 抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 抽象类 ...

  6. sublime2创建一个html5的snippets文件

    背景:跟了一个网上课程,老师哗啦啦敲代码,屏幕上只敲了几个字,键盘一操作,瞬间一大溜代码,看得我心惊肉跳连忙暂停抄抄抄. 举个简单的例子,我需要创建一个html文件.但是我不想每次都敲固定的格式.那么 ...

  7. 我们用CloudStack做什么

    原文地址:http://www.sdfengxi.com/?p=376 我想很多同学会有类似的疑问,就是我配置好了CloudStack或者OpenStack之类的环境之后能够提供什么服务或者应用呢?下 ...

  8. CSS3奇偶选择器

    .search-form td:nth-child(odd){//奇 width:100px; text-align:right;} .search-form td:nth-child(even){/ ...

  9. Nginx使用教程----提高Nginx网络吞吐量之buffers优化

    请求缓冲区在NGINX请求处理中起着重要作用. 在接收到请求时,NGINX将其写入这些缓冲区. 这些缓冲区中的数据可作为NGINX变量使用,例如$request_body. 如果缓冲区与请求大小相比较 ...

  10. 51Nod 1256 求乘法逆元--扩展欧几里德

    #include<stdio.h> int exgcd(int a,int b,int &x,int &y) { ) { x=; y=; return a; } int r ...