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;
    }
  • 相关阅读:
    漫谈施工企业信息化规划(修订)
    SOAOffice 中间件,北京科翰软件
    组建“建筑施工企业信息化技术交流”QQ群(102226121),欢迎参与!
    国产、免费业务流程梳理工具SAM,炎黄盈动公司产品
    (参考)OpenExpressApp架构-信息系统开发平台
    逍遥笔输入法,哈!
    昨天开了一天的会!!
    昨天回到北京了!
    幸福是什么?
    周末辽宁兴城
  • 原文地址:https://www.cnblogs.com/farewell-farewell/p/5244840.html
Copyright © 2011-2022 走看看