uva 12096

优先队列,主要是STL应用所以复制一下

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <algorithm>

#include <map>

#include <cmath>

#include <cstring>

#include <string>

#include <queue>

#include <stack>

#include <cctype>

#include <set>

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

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



using namespace std;



const int maxn = 10005;



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()

{

#ifndef ONLINE_JUDGE

    freopen("in.in","r",stdin);

#endif

  //  freopen("out.out","w",stdout);

    stack<int>s;

    int t;

    cin >> t;

    while(t--){

    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;

    }

    return 0;

}
啊哈哈哈

 

你可能感兴趣的:(uva)