集合栈计算机(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作为存储每种集合的cache,这样,每当map中没有相应的ID时,我们就向vector中加入一个set元素,并将下标作为ID进行唯一的标识。

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

//聚合栈计算机
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<stack>
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];   //map中已有key(x),返回对应的value值
	Setcache.push_back(x); //map中没有key(x),将其插入vector 中
	return IDcache[x]=Setcache.size()-1;  //将key(x)存入map中,并将对应的value赋值为在vector中的下标
}
int main()
{
	int n,k;
	stack<int> s;
	cin>>n;
	while(n--)
	{
		cin>>k;
		while(k--)
		{
			string str;
			cin>>str;
			if(str[0]==‘P‘) s.push(ID(set())); //空集入栈
			else if(str[0]=‘D‘) s.push(s.top());  //把当前栈顶元素复制一份后再入栈
			//剩下的三种操作,涉及到ID
			else
			{
				Set x1 = Setcache[s.top()]; s.pop();  //栈顶第一个集合   (注意:s.top()是一个id)
				Set x2 = Setcache[s.top()]; s.pop();  //第二个
				Set x;   //有一个取并,交的新的集合 

				if (str[0] == ‘U‘) set_union(x1.begin(), x1.end(), x2.begin(), x2.end(), inserter(x, x.begin()));
				if (str[0] == ‘I‘) set_intersection(x1.begin(), x1.end(), x2.begin(), x2.end(), inserter(x, x.begin()));
				if (str[0] == ‘A‘) { x = x2; x.insert(ID(x1)); }  //将x1的ID插入到x中
				s.push(ID(x));  //合并后的x存入vector中,再将ID压入栈中
			}
			cout << Setcache[s.top()].size() << endl;
		}
	}
	return 0;
}

原文地址:https://www.cnblogs.com/serendipity-my/p/12643820.html

时间: 2024-08-29 15:01:24

集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096)的相关文章

打印队列 (Printer Queue,ACM/ICPC NWERC 2006,UVA12100)

题目描述: 题目思路: 使用一个队列记录数字,一个优先队列记录优先级,如果相等即可打印: 1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 int main(int argc, char *argv[]) 5 { 6 int t; 7 cin >> t; 8 while(t--) 9 { 10 int n,pos; 11 queue<int> q ; 12 priority_q

stack 集合栈计算机 (摘)

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

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

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

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

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

uva12096集合栈计算机

背景:这道题出现在我学习c++的stl中,对现在还不了解stl的人来说,确实显得太难了,只有照着书打下代码,然后一步一步的理解. 思路:由于本题的的集合并不是简单的整数集合或者字符串集合,所以就用map建立映射关系,而再建立映射关系的时候,又运用了vector协助,这样就能很明确的使得每个集合都有一个ID,然后就是堆栈的一些操作了. 学习:stl里面一些知识的简单运用. #include <iostream> #include <set> #include <map>

C#常用的集合类型(ArrayList类、Stack类、Queue类、Hashtable类、SortedList类)

1.ArrayList类 ArrayList类主要用于对一个数组中的元素进行各种处理.在ArrayList中主要使用Add.Remove.RemoveAt.Insert四个方法对栈进行操作.Add方法用于将对象添加到 ArrayList 的结尾处:Remove方法用于从 ArrayList 中移除特定对象的第一个匹配项:RemoveAt方法用于移除 ArrayList 的指定索引处的元素:Insert方法用于将元素插入 ArrayList 的指定索引处. 示例 ArrayList的使用 示例将介

ACM/ICPC 之 用双向链表 or 模拟栈 解“栈混洗”问题-火车调度(Tshing Hua OJ - Train)

本篇用双向链表和模拟栈混洗过程两种解答方式具体解答“栈混洗”的应用问题 有关栈混洗的定义和解释在此篇:手记-栈与队列相关 列车调度(Train) Description Figure 1 shows the structure of a station for train dispatching. Figure 1 In this station, A is the entrance for each train and B is the exit. S is the transfer end.

【转】[email&#160;protected]&#183;ACM/ICPC 回忆录

转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC这项赛事是在大三上的算法课上张老师提到的,当时我们学校的组织参加这项活动才刚刚起步,我也没太在意,总觉得那是非常遥远的事,事实上当时我也从未相当如今我们能获得现在的成绩.真正踏入ACM/ICPC这个神奇的世界,不得不提到2004那一年我们学校的参赛队伍xmutank,正是听了pipo师兄的精彩演讲以

HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)

Friends and Enemies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 291    Accepted Submission(s): 160 Problem Description On an isolated island, lived some dwarves. A king (not a dwarf) ruled t