例题5-5  集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096)

 例题5-5 
集合栈计算机(The 
Set 
Stack 
Computer,ACM/ICPC 
NWERC 
2006,UVa12096) 
有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且 
支持以下操作。 
PUSH:空集“{}”入栈。 
DUP:把当前栈顶元素复制一份后再入栈。 
UNION:出栈两个集合,然后把二者的并集入栈。 
INTERSECT:出栈两个集合,然后把二者的交集入栈。ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈。 
每次操作后,输出栈顶集合的大小(即元素个数)。例如,栈顶元素是A={ {}, 
{ {}}},下一个元素是B={ {},{ { {}}}},则: 
UNION操作将得到{ {},{ {}},{ { {}}}},输出3。 
INTERSECT操作将得到{ {}},输出1。 
ADD操作将得到{ {},{ { {}}},{ {},{ {}}}},输出3。 
输入不超过2000个操作,并且保证操作均能顺利进行(不需要对空栈执行出栈操作)。 
Sample Input 


PUSH 
DUP 
ADD 
PUSH 
ADD 
DUP 
ADD 
DUP 
UNION 

PUSH 
PUSH 
ADD 
PUSH 
INTERSECT 
Sample Output 









*** 





***

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<stack>
#include<set>
#include<algorithm>

#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())

typedef set<int> Set;
map<Set,int> IDcach;
vector<Set> Setcach;

using namespace std;

int ID(Set x)
{
    if(IDcach.count(x)) return IDcach[x];
    Setcach.push_back(x);
    return IDcach[x] = Setcach.size()-1;
}

int main()
{
    stack<int> s;
    int m;
    cin>>m;
    while(m--)
    {
        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 = Setcach[s.top()]; s.pop();
                Set x2 = Setcach[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<<Setcach[s.top()].size()<<endl;
        }
        cout<<"***"<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40099908/article/details/81905880