The SetStack Computer UVA - 12096

 原题链接:https://vjudge.net/problem/UVA-12096

代码转载自:https://blog.csdn.net/somniloquy_/article/details/47759751

#include <iostream>
#include <cstdio>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <algorithm>                //set_union set_intersection 的头文件
 
using namespace std;
 
int t, n;
string operation;                   //操作字符
typedef set<int> SET;               //简化 set<int>
map<SET, int> IDcache;              //将每个不同的集合用int整数表示
vector<SET> SETcache;               //存入集合的vector。根据ID取集合
stack<int> element;                 //定义int堆。先进后出
 
inline int ID(SET x)                //查找给定集合x的ID。如果找不到,分配一个新的ID
{
    if(!IDcache.count(x))
    {
        SETcache.push_back(x);
        IDcache[x] = SETcache.size() - 1;
    }
    return IDcache[x];
}
 
int main()
{
    scanf("%d", & t);
    while(t --)
    {
        scanf("%d", & n);
        while(n --)
        {
            cin >> operation;
            SET null;
            if(operation == "PUSH")
                element.push(ID(null));             //原 element.push(SET())。均为空集
            else if(operation == "DUP")
                element.push(element.top());
            else
            {
                SET x1 = SETcache[element.top()];   //从里往外 element.top()取栈顶元素(栈存储的是int 即集合的ID)SETcache(序号)即是栈顶集合 栈顶集合也是由int组成
                element.pop();                      //去掉栈顶元素 为第二次取栈顶元素做准备
                SET x2 = SETcache[element.top()];
                element.pop();
                SET x;
                if(operation == "UNION")
                    set_union(x1.begin(),x1.end(), x2.begin(),x2.end(), inserter(x, x.begin())); //并集
                else if(operation == "INTERSECT")
                    set_intersection(x1.begin(),x1.end(), x2.begin(),x2.end(), inserter(x, x.begin())); //交集
                else if(operation == "ADD")
                {
                    x = x2;
                    x.insert(ID(x1));   //将x1(集合内均是用int序号表示的集合)集合插入x2
                }
                element.push(ID(x));    //将集合x重新放入栈
            }
            cout << SETcache[element.top()].size() << endl;         //输出栈顶集合大小
        }
        cout << "***" << endl;          //输出格式
    }
    return 0;
}

下面附一个讲解set_union, set_intersection函数的链接:https://blog.csdn.net/zangker/article/details/22984803

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值