UVa 12096 map ,vector,set,string ,stack的混用

背景:这个题对stl不熟悉根本无法自己作,只有照着理解书上的代码。

思路:用一个vector容器来储存集合,map中key为集合,value为该集合对应的vector容器的下标,并把下标称为ID,stack中储存的是ID每次对stack执行操作,实际是对stack中ID对应的集合执行操作用到了set_uinon和set_intersection。

#include<iostream>
#include<vector>
#include<map>
#include<algorithm>    //set_union 和 set_interscetion 都在该头文件中,类似的还有set_difference差集
#include<set>
#include<stack>
#include<string>
using namespace std;
map<set<int>,int> map_list;
vector<set<int> > vector_ID;
set<int> setempty;

int ID(set<int> set_temp){   //输入一个集合,若该集合已经存在,直接返回ID,若不存在,新建一个map,并把该集合加入vector中。
    if(map_list.count(set_temp)) return map_list[set_temp];
    vector_ID.push_back(set_temp);
    return map_list[set_temp]=vector_ID.size()-1;
}/*核心思想是用一个vector协助map完成对集合的ID化,最后计算集合内元素个数是,只需调用vector中对应的集合元素,用size函数*/

int main(void){
    int n,t;
    cin>>n;
    while(n--){
        cin>>t;
        stack<int> stack_ID;
        while(t--){
            string operation;
            cin >> operation;
            if(operation == "PUSH") stack_ID.push(ID(setempty));
            else if(operation == "DUP") stack_ID.push(stack_ID.top());
            else{
                set<int> x1=vector_ID[stack_ID.top()];stack_ID.pop();
                set<int> x2=vector_ID[stack_ID.top()];stack_ID.pop();
                set<int> x;
                if(operation == "UNION") set_union(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin()));    <span id="transmark"></span>//注意这里参数
                if(operation == "INTERSECT") set_intersection(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin()));
                if(operation == "ADD"){x=x2;x.insert(ID(x1));}
                stack_ID.push(ID(x));
            }
            cout<<vector_ID[stack_ID.top()].size()<<endl;
        }
        cout<<"***"<<endl;
    }
    return 0;
}
时间: 2024-10-11 09:10:48

UVa 12096 map ,vector,set,string ,stack的混用的相关文章

UVA 12096 STL map set 的使用

set这个容器也是STL库的一员,并且在algorithm内直接有 set_union set_intersection  这样求并集交集的操作 map 最方便的地方就是 支持下标访问 举例说明 : 1 #include<iostream> 2 include<cstdio> 3 #include<cstring> 4 #include<vector> 5 #include<map> 6 #include<set> 7 #includ

C++各个容器比较(vector,deque,list,set,map,queue,stack)

1.vector(连续的空间存储,可以使用[ ]操作符)可以快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间随机的插入.删除元素要慢.而且,如果一开始分配的空间不够时,有一个重新分配更大空间的过程. 2.deque(小片的连续,小片间用链表相连,实际上内部有一个map的指针,因为知道类型,所以还是可以使用[ ],只是速度没有vector快)快速的访问随机的元素,快速的在开始和末尾插入元素.随机的插入删除元素要慢,空间的从新分配空间后,原有的元素不需要备份.对deque的排序操作,可将d

UVa 12096 The SetStack Computer

Description Background from Wikipedia: "Set theory is a branch of mathematics created principally by the German mathematician Georg Cantor at the end of the 19th century. Initially controversial, set theory has come to play the role of a foundational

uva 12096 - The SetStack Computer(STL)

UVA 12096 - The SetStack Computer 题目链接 题意:几个操作,push是在栈顶加入一个空集,dup是复制栈顶集合,在放入栈顶,union是把头两个取并集放回,int是头两个取交集放回,add是取头两个,把第一个当成一个集合加入第二个,每次操作输出栈顶集合的里面的个数 思路:用set,stack模拟,然后利用map去hash一个集合,模拟即可 代码: #include <cstdio> #include <cstring> #include <s

UVa 12096 (STL) The SetStack Computer

题意: 有一个集合栈计算机,栈中的元素全部是集合,还有一些相关的操作.输出每次操作后栈顶集合元素的个数. 分析: 这个题感觉有点抽象,集合还能套集合,倒是和题中配的套娃那个图很贴切. 把集合映射成ID,就可以用 stack<int>来模拟题中的集合栈,然后用 vector<Set> 来根据下标进行集合的索引. 代码虽短,但还须多体会. 1 #include <cstdio> 2 #include <string> 3 #include <vector&

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

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

java中List、Map、Set、Stack、Queue、Collections等的使用

java中List.Map.Set.Stack.Queue.Collections等的使用 List 创建方法: List<String> list=new ArrayList<>(); add(val) : 添加元素. get(index) : 获取元素. remove(index) : 删除元素. remove(Object o) : 按照元素内容删除 {eg:list.add("marry") ; list.remove(0)==list.remove(&

[UVA 12589]Learning Vector[DP]

题目链接:[UVA 12589]Learning Vector[DP] 题意分析:给出n个矢量,从中选择k个,以坐标原点为起点,收尾相连,问:这样的k个周围相连矢量与x轴围成图形的最大面积的两倍是多少? 解题思路:考虑状态:dp[id][pick][h]代表到第id个矢量为止,选择pick个矢量离最大面积还差多少,h为当前图形最右端高度.具体转移看代码. 这里着重说一下为什么要对这些矢量按斜率进行排序: 首先,整个求解过程其实就是在暴力枚举这些向量的组合,只不过采用了记忆化搜索优化. 其次,对于

Java遍历List,Map,Vector,Set的几种方法

关于list,map,set的区别参考http://www.cnblogs.com/qlqwjy/p/7406573.html 1.遍历list @Test public void testList() { List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); System.out.println("-------------------list------------------