uva12096集合栈计算机

背景:这道题出现在我学习c++的stl中,对现在还不了解stl的人来说,确实显得太难了,只有照着书打下代码,然后一步一步的理解。

思路:由于本题的的集合并不是简单的整数集合或者字符串集合,所以就用map建立映射关系,而再建立映射关系的时候,又运用了vector协助,这样就能很明确的使得每个集合都有一个ID,然后就是堆栈的一些操作了。

学习:stl里面一些知识的简单运用。

#include <iostream>

#include <set>

#include <map>

#include <stack>

#include <vector>

#include <algorithm>

using namespace std;

typedef set<int> Set;

map<Set,int> IDcache;

vector<Set> Setcache;

int ID(Set x)

{

if(IDcache.count(x)) return IDcache[x];

Setcache.push_back(x);

return IDcache[x]=Setcache.size()-1;

}

#define ALL(x) x.begin(),x.end()

#define INS(x) inserter(x,x.begin())

stack<int> s;

int main(void)

{

int n;

cin>>n;

while(n--)

{

int m;

cin>>m;

for(int i=0;i<m;i++)

{

string op;

cin>>op;

if(op[0]==‘P‘) s.push(ID(Set()));

else if(op[0]==‘D‘) s.push(s.top());

else

{

Set x1=Setcache[s.top()];s.pop();

Set x2=Setcache[s.top()];s.pop();

Set x;

if(op[0]==‘U‘) set_union(ALL(x1),ALL(x2),INS(x));

if(op[0]==‘I‘) set_intersection(ALL(x1),ALL(x2),INS(x));

if(op[0]==‘A‘) {x=x2;x.insert(ID(x1));}

s.push(ID(x));

}

cout<<Setcache[s.top()].size()<<endl;

}

cout<<"***"<<endl;

}

return 0;

}

时间: 2024-08-27 23:21:05

uva12096集合栈计算机的相关文章

集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096)

集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096) 对于集合的集合,很难直接表示,因此,为方便起见,为每个不同的集合分配一个不同的ID,每个集合都可以表示成所含集合的ID集合,一个集合就可以表示为一个set 我的理解: {}:1 {{}} 2 栈中的都是集合,所以也是int类型的 实际进行操作的过程中,可以用map将每种集合和对应的ID关联起来,这样做既可以完成查找ID的任务,还可以同时判定是否出现了新的集合. 用vector作

算法入门经典-第五章 例题 5-5 集合栈计算机

The SetStack Computer Time limit: 3.000 seconds 题目是这样的: 有一个专门为了集合运算而设计的"集合栈"计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集"{}"入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入栈INTERSECT:出栈两个集合,然后把二者的交集入栈ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈       每次操作后,输出

stack 集合栈计算机 (摘)

有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入栈INTERSECT:出栈两个集合,然后把二者的交集入栈ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈       每次操作后,输出栈顶集合的大小(即元素个数).例如栈顶元素是A={ {}, {{}} }, 下一个元素是B={ {}, {{{}}} },则:UNION操作将

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

[题意] 有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入栈,并输出并集的sizeINTERSECT:出栈两个集合,然后把二者的交集入栈,并输出交集的sizeADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈,并输出结果的size       每次操作后,输出栈顶集合的大小(即元素个数).例如栈顶元素是A={ {}, {{}

【13】集合栈

[题目] 请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈.该数据结构应支持与普通栈相同的push和pop操作. 给定一个操作序列int[][2] ope(C++为vector&ltvector&ltint>>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字:若为2,则为pop操作,后一个数无意义.请返回一个int[][](C++为vector&ltvector&am

2017年11月4日 vs类和结构的区别&amp;哈希表&amp;队列集合&amp;栈集合&amp;函数

类和结构的区别 类: 类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存 类有构造和析构函数 类可以继承和被继承 结构: 结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象. 结构没有构造函数,但可以添加.结构没有析构函数 结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口 //哈希表 //不规定长度 不规定类型 不规定建类型 //Hashtable j = new Hashtable(); //

【c#基础】集合--栈Stack 链表 LinkList 有序列表SortedList 字典

栈:是一个后进先出(LIFO)的容器 栈 push()方法在栈中添加元素,用Pop()方法获取最近添加的元素. 于Queue<T>类相似,Stack<T>类实现IEnumerable<T>和ICollection接口 Count   返回栈中的元素个数 Push    在栈顶添加一个元素 Pop 从站定删除一个元素,并返回该元素,如果栈是空的,就抛出InvalidOperationException异常 Peek    返回栈顶的元素,但不删除它 Contains 确定

pyhton 全栈 计算机的构成

? 计算机的硬件构成 一台完好无损的计算机主要分为 硬件与软件两大类组成 而硬件则又分为几个主要的部分构成 控制器 输入 输出 存储器 运算器 ( 主板 键盘 鼠标 显示屏 硬盘 主机箱 扫描仪--) 计算机的软件构成 计算机的软件组要分为 (系统软件 和 应用软件) 两大类组成系统软件 是控制和协调计算机的外部设备 支持 应用软件的开发和运行的系统 应用软件 是指用户可以使用各种程序设计语言编程语言的作用 编程语言是用来定义计算机程序的形式语言 标准化的交流技巧以及 向计算机发出指令 准确的定

集合栈

对入栈和出栈操作,top都需要相应加减,对一些条件的判断. /***************************************************** * \file SetOfStacks.cpp * \date 2016/05/05 17:49 * \问题描述: 请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈. 该数据结构应支持与普通栈相同的push和pop操作. 给定一个操作序列int[][2] ope(C