UVa - 12096 集合栈计算机(STL)
【题意】
有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且支持以下操作:
PUSH:空集“{}”入栈
DUP:把当前栈顶元素复制一份后再入栈
UNION:出栈两个集合,然后把两者的并集入栈,并输出并集的size
INTERSECT:出栈两个集合,然后把二者的交集入栈,并输出交集的size
ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈,并输出结果的size
每次操作后,输出栈顶集合的大小(即元素个数)。例如栈顶元素是A={ {}, {{}} }, 下一个元素是B={ {}, {{{}}} },则:
UNION操作将得到{ {}, {{}}, {{{}}} },输出3.
INTERSECT操作将得到{ {} },输出1
ADD操作将得到{ {}, {{{}}}, { {}, {{}} } },输出3.
其他操作输出0
多组输入输出,每组输出后输出一行“ *** ”
输入不超过2000个操作
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
***
【代码】
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <map>
#include <set>
#include <stack>
#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;
vector<Set> Setcache; int ID(Set x) //找到集合x在列表中的代表id
{
if (IDcache.count(x)) return IDcache[x];
Setcache.push_back(x);//如果没找到就新加一个
return IDcache[x] = Setcache.size()-;
} int main()
{
int T;
cin >> T;
while(T--)
{
IDcache.clear();
Setcache.clear(); stack<int> s;
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
string opr;
cin >> opr;
if (opr[] == 'P')
s.push(ID(Set()));
else if (opr[] == 'D')
s.push(s.top());
else
{
Set x, y, sum;
x = Setcache[s.top()]; s.pop();
y = Setcache[s.top()]; s.pop(); if (opr[] == 'U')
set_union(ALL(x), ALL(y), INS(sum));
//set_union()合并x和y 存入sum
else if (opr[] == 'I')
set_intersection(ALL(x), ALL(y), INS(sum));
//set_intersection()求x和y的交集,存入sum
else if (opr[] == 'A')
{
sum = y;
sum.insert(ID(x));//不是把两个集合合并,而是x是y的一个元素
}
s.push(ID(sum));
}
printf("%d\n", Setcache[s.top()].size());
}
printf("***\n");
}
}
UVa - 12096 集合栈计算机(STL)的更多相关文章
- UVA12096 集合栈计算机(map和vector实现双射关系+集合的交并运算的STL)
题目大意: 对于一个以集合为元素的栈,初始时栈为空. 输入的命令有如下几种: PUSH:将空集{}压栈 DUP:将栈顶元素复制一份压入栈中 UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果 ...
- 5_5 集合栈计算机(UVa12096)<stack与STL其他容器的综合运用>
有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始化为空的栈,并支持以下操作:( 维护 N(1≤N≤2000) 个操作, 可能的五种操作如下:) ■PUSH: 在栈顶加入一个空集合 A= ...
- stack 集合栈计算机 (摘)
有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入 ...
- 集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096)
集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096) 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该 ...
- 算法习题---5.5集合栈计算机(Uva12096)*****
一:题目 对于一个以集合为元素的栈,初始时栈为空. 输入的命令有如下几种: PUSH:将空集{}压栈 DUP:将栈顶元素复制一份压入栈中 UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果压 ...
- 集合栈计算机(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) 有一个专门为了集合运算而设计的"集合栈"计算机. ...
- UVa 12096 (STL) The SetStack Computer
题意: 有一个集合栈计算机,栈中的元素全部是集合,还有一些相关的操作.输出每次操作后栈顶集合元素的个数. 分析: 这个题感觉有点抽象,集合还能套集合,倒是和题中配的套娃那个图很贴切. 把集合映射成ID ...
随机推荐
- SpringBoot---核心---日志配置
- Cube中维度排序-通过在数据仓库增加列来实现排序
数据仓库增加排序列: 维度设置: 正确结果:
- dede用户登录时,跳转到提示页时报404错误
做了一个项目,本地运行,用的是Apache服务器,一切正常. 可是当我把项目放到VPS中运行时,每当输入用户名登录时,调转到"成功登录,3秒钟后转向网站主页"的提示页面时,页面的顶 ...
- tomcat调优方案Maximum number of threads (200) created for connector with address null and port 8091
1.tomcat6大并发出现:INFO: Maximum number of threads (200) created for connector with address null and por ...
- Flask 学习系列(四)---Jinjia2 模板继承
1.基模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 记录:swift学习笔记1-2
swift还在不断的更新做细微的调整,都说早起的鸟儿有虫吃,那么我们早点出发吧,趁着国内绝大多数的coder们还没有开始大范围普遍应用. 网上有些大神说:swift很简单!我不同意这个观点,假如你用h ...
- SQL Server数据库log shipping 灾备(Part2 )
3.配置步骤: 主服务器(A机)设置 (1) 启用Log Shipping Configuration 右键单击需要配置日志传输的数据库->Tasks-> Ship Transaction ...
- Selenium3+webdriver学习笔记2(常用元素定位方式,定位单个元素共8种,总共有23种)
#!/usr/bin/env python# -*- coding:utf-8 -*- from selenium import webdriver import time,os # about:ad ...
- Python+selenium之跳过测试和预期失败
在运行测试时,需要直接跳过某些测试用例,或者当用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败.unittest单元测试框架提供了实现这些需求的装饰器. 1.unittest.skip(re ...
- SpringMVC-常用的注解
1. RequestParam注解 把请求中的指定名称的参数传递给控制器中的形参赋值 value:请求参数中的名称 require:请求参数中是否必须提供此参数,默认值是true,必须提供 2. Re ...