uva 12096 - The SetStack Computer(集合栈)
例题5-5
集合栈计算机(The
Set
Stack
Computer,ACM/ICPC
NWERC
2006,UVa12096)
有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且
支持以下操作。
PUSH:空集“{}”入栈。
DUP:把当前栈顶元素复制一份后再入栈。
UNION:出栈两个集合,然后把二者的并集入栈。
INTERSECT:出栈两个集合,然后把二者的交集入栈。ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈。
每次操作后,输出栈顶集合的大小(即元素个数)。例如,栈顶元素是A={{},
{{}}},下一个元素是B={{},{{{}}}},则:
UNION操作将得到{{},{{}},{{{}}}},输出3。
INTERSECT操作将得到{{}},输出1。
ADD操作将得到{{},{{{}}},{{},{{}}}},输出3。
输入不超过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
***
性质:
1、set< int > 代表是集合
2、idcache 是集合与其编号的映射,每一个集合都有唯一的编号。
3、setcache是向量,即下标与其存的是集合的元素相映射。
4、每一个集合都只在以上容器中存在一个。
5、栈里存的只是集合的编号。
#include <iostream>
#include <set>
#include <map>
#include <stack>
#include <vector>
using namespace std;
map< set<int> ,int> idcache; //每一个集合对应一个编号
vector< set<int> > setcache; //每一个编号对应一个集合
int getid(set<int> s)
{
if(idcache.count(s))
return idcache[s];
else
setcache.push_back(s); //将集合存入vector
idcache[s]=setcache.size()-1; //将集合存入map,从0开始,为了让map中的键与值与vector元素与下标相对应
return idcache[s];
}
int main()
{
int T;
cin>>T;
while(T--)
{
stack<int> s; //只是存的集合的编号
idcache.clear();
setcache.clear();
int n;
cin>>n;
while(n--)
{
// cout<<"n"<<n<<endl;
string str;
cin>>str;
if(str=="PUSH")
{
set<int> temps;
int temp=getid(temps);
s.push(temp);
}
else if(str=="DUP")
{
s.push(s.top());
}
else
{
set<int> first =setcache[s.top()]; //这时要取的是vetor中的元素,是set<int>类型,而s里元素是int类型
s.pop();
set<int> second=setcache[s.top()];
s.pop();
set<int> ans;
if(str=="INTERSECT")
{
set<int>::iterator i=first.begin();
for(;i!=first.end();i++)
{
set<int>::iterator j=second.begin();
for(;j!=second.end();j++)
{
if(*i==*j)
ans.insert(*i);
}
}
}
if(str=="UNION")
{
ans=second; //直接赋值set<int>
set<int>::iterator i=first.begin();
for(;i!=first.end();i++)
{
ans.insert(*i);
}
}
if(str=="ADD")
{
ans=second; //直接赋值set<int>
ans.insert(getid(first)); //插入int型,是first对应的编号,将first作为了ans的一个元素
}
s.push(getid(ans));
}
cout<<setcache[s.top()].size()<<endl;
// cout<<str<<":"<<endl;
// stack<int> t=s;
// for(int i=0;i<s.size();i++)
// { int ii=t.top();
// t.pop();
// set<int>::iterator it=setcache[ii].begin();
// for(;it!=setcache[ii].end();it++)
// cout<< *it<<" ";
// cout<<"|"<<endl;
// }
// cout<<endl;
}
cout<<"***"<<endl;
}
return 0;
}
//AC at 2018/5/7
uva 12096 - The SetStack Computer(集合栈)的更多相关文章
- UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用)
UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用) 题意分析 绝对的好题. 先说做完此题的收获: 1.对数据结构又有了宏观的上的认识; 2.熟悉了常用STL ...
- uva 12096 The SetStack Computer
点击打开链接uva 12096 思路: STL模拟 分析: 1 题目给定5种操作,每次输出栈顶集合的元素的个数 2 利用stack和set来模拟,set保存集合的元素.遇到push的时候直接在stac ...
- UVa 12096 The SetStack Computer【STL】
题意:给出一个空的栈,支持集合的操作,求每次操作后,栈顶集合的元素个数 从紫书给的例子 A={{},{{}}} B={{},{{{}}}} A是栈顶元素,A是一个集合,同时作为一个集合的A,它自身里面 ...
- uva 12096 The SetStack Computer(STL set的各种库函数 交集 并集 插入迭代器)
题意: 有5种操作: PUSH:加入“{}”空集合入栈. DUP:栈顶元素再入栈. UNION:出栈两个集合,取并集入栈. INTERSECT:出栈两个集合,取交集入栈. ADD:出栈两个集合,将先出 ...
- 12096 - The SetStack Computer UVA
Background from Wikipedia: \Set theory is a branch of mathematics created principally by the German ...
- UVa12096.The SetStack Computer
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096)
集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096) 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该 ...
- UVa 12096 (STL) The SetStack Computer
题意: 有一个集合栈计算机,栈中的元素全部是集合,还有一些相关的操作.输出每次操作后栈顶集合元素的个数. 分析: 这个题感觉有点抽象,集合还能套集合,倒是和题中配的套娃那个图很贴切. 把集合映射成ID ...
- UVa - 12096 集合栈计算机(STL)
[题意] 有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两 ...
随机推荐
- SOL的补充
之前写过一些关于远程安装系统的文档,但是对于SOL还是糊涂不清. Serial Console 可以将输入输出转发到串行接口(com1, com2), 假如你有串行读取设备,就可以看到显示,控制输入. ...
- Windows平台,Oracle Database和Client并存方式
由于某些特定需求,生产环境需要在同一台机器上同时安装Database Server和Client,因为plsql没有64位客户端,无法读取64位database的oci.dll文件,所以需要一个32位 ...
- [原]Machine Learing 入门 —— 开门第0篇
一.最近懒了 7月没怎么写博客,倒是一直在学Machine Learning的入门知识,在这里给大家推荐一个不错的自学网站:https://www.coursera.org/ ,Andrew Ng是联 ...
- 简单的PHP算法题
简单的PHP算法题 目录 1.只根据n值打印n个0 2.根据n值打印一行 0101010101010101010101…… 3.根据n值实现1 00 111 0000 11111…… 4.根据n值实现 ...
- ArcGIS10.1之crossdomain文件
大家都知道在10.1之前的版本在开发的时候需要使用跨域部署文件crossdomain.xml文件,在10.1中该文件不需要单独拷贝到IIS根目录或者是java版本的weboutput目录,在serve ...
- 课堂笔记——while循环
用 while循环 1.100以内所有数的和 static void Main1(string[] args) //不是自己做的 { //100以内所有数的和 ; ; //初始条件 ) //循环条件 ...
- 更改win7关机菜单选项功能
说明:如果你不希望别人对你的电脑进行注销切换等操,那么可以使用如下的方法 实现效果: 实现步骤: 效果1 1>切换用户: 2>注销:(需重启资源管理器生效) 效果2:
- axis调用cxf的webservice注意事项
需要注意的是: 1.wsdl显示部分内容 <?xml version="1.0" ?> - <wsdl:definitions name="Archiv ...
- 最短路径问题:弗洛伊德算法(Floyd)
Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被 ...
- 在CentOs6.5下安装Python2.7.6和Scrapy
总在网上看大家的安装教程,这回自己也贡献一份!!! 和民航大学合作项目,去给人家装环境,连简单的Scrapy都没装上,虽然有对方硬件设施坑爹的因素,但主要还是自己准备不充分. 一份好的安装文档应该是可 ...