紫书UVA 12096

STL综合运用(set_union和set_intersection)
/*Input
An integer 0 ≤ T ≤ 5 on the first line gives the cardinality of the set of test cases. The first line of each
test case contains the number of operations 0 ≤ N ≤ 2000. Then follow N lines each containing one of
the five commands. It is guaranteed that the SetStack computer can execute all the commands in the
sequence without ever popping an empty stack.
Output
For each operation specified in the input, there will be one line of output consisting of a single integer.
This integer is the cardinality of the topmost element of the stack after the corresponding command
has executed. After each test case there will be a line with ‘***’ (three asterisks).
Sample Input
2
9
PUSH
DUP
ADD
PUSH
ADD
DUP
ADD
DUP
UNION
5
PUSH
PUSH
ADD
PUSH
INTERSECT
Sample Output
0
0
1
0
1
1
2
2
2
***
0
0
1
0
0
****/
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
typedef set<int> Set;
map<Set,int>IDcache;
vector<Set> Setcache;
int ID(Set x)
{
    if(IDcache.count(x))return IDcache[x];
    Setcache.push_back(x);
    return IDcache[x]=Setcache.size()-1;
}
int main()
{
    int cas;
    cin>>cas;
    while(cas--)
    {
        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()];s.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;
    }
    cout<<"***"<<endl;
    }
}

posted @ 2018-04-11 19:48  MCQ  阅读(110)  评论(0编辑  收藏  举报