UVA12096 集合栈计算机

#include<iostream>
#include<set>
#include<vector>
#include<map>
#include<algorithm>
#include<stack>
#include<cstring>
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
using namespace std;
typedef set<int> Set;
map<Set,int > IDL;
vector<Set> Setcache;
int ID(Set x)
{
  if(IDL.count(x))
    return IDL[x];
  Setcache.push_back(x);
  return IDL[x]=Setcache.size()-1;
}
int main()
{
  int t;
  cin>>t;
  while(t--)
  {
    int n;
    cin>>n;stack<int >s;
    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;
}

posted @ 2019-05-26 23:21  ACM-Lxw  阅读(112)  评论(0编辑  收藏  举报