考验对STL的熟练运用
![这里写图片描述](https://img-blog.csdn.net/20170717142356673?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTF9IX0w=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
int t, n;
set<int> Set;
map<set<int>, int > IDcache;
vector<set<int>> Setcache;
int ID(set<int> x)
{
if (IDcache.count(x))
return IDcache[x];
Setcache.push_back(x);
return IDcache[x] = Setcache.size() - 1;
}
int main() {
cin >> t;
while (t--)
{
string op;
cin >> n;
stack<int> s;
for (int i = 0; i < n; i++)
{
cin >> op;
if (op[0] == 'P')
s.push(ID(set<int>()));
else if (op[0] == 'D')
{
s.push(s.top());
}
else
{
set<int> x1 = Setcache[s.top()]; s.pop();
set<int> x2 = Setcache[s.top()]; s.pop();
set<int> 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;
}