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;
}
啊哈哈哈
原文地址:https://www.cnblogs.com/hanbinggan/p/4248966.html