zoukankan      html  css  js  c++  java
  • stack 集合栈计算机 (摘)

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

    输入不超过2000个操作

    Sample Input

    9
    PUSH
    DUP
    ADD
    PUSH
    ADD
    DUP
    ADD
    DUP
    UNION

    Sample Output

    0
    0
    1
    0
    1
    1
    2
    2
    2

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<iterator>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    typedef set<int> Set;          
    map<Set,int> IDcache;           //把集合映射成ID
    vector<Set> Setcache;    
    int ID(Set x)              //查找给定集合x的ID,如果找不到,分配一个新ID
    {
        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())
    int main() 
    {
        stack<int> s;
        int n;
        cin>>n;
        for(int i=0;i<n;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()];          //top()取栈顶元素(但不删除)
                s.pop();                           //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;
        }
        system("pause");
        return 0;
    }
  • 相关阅读:
    基于 OAI 部署私有的 4G EPS
    Ubuntu Snap 简述
    OAI SDR LTE 基站部署
    企业文化二三谈
    OpenStack 的 SR-IOV 虚拟机热迁移
    在 ThinkPad E470 上安装 Ubuntu 16.04 无线网卡驱动
    读写可编程 SIM/USIM 卡
    4G LTE/EPC UE 的附着与去附着
    4G EPS 的网络协议栈
    Java- 类型转换
  • 原文地址:https://www.cnblogs.com/farewell-farewell/p/5244840.html
Copyright © 2011-2022 走看看