#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<map>
#include<set>
#include<stack>
using namespace std;
typedef set<int> Set;
map<Set,int>IDcache;//把集合映射成ID
vector<Set>Setcache;//根据ID取集合
int T,N;
//查找给定集合x的ID。如果找不到,分配一个新的ID
int ID(Set x)
{
if(IDcache.count(x)){return IDcache[x];}
Setcache.push_back(x);//添加新的集合
return IDcache[x]=Setcache.size()-1;
}
#define ALL(x) x.begin(),x.end()
#define INSC(x) inserter(x,x.begin())
stack<int>s;//栈里面存放集合的编号
string str;
Set x1;
Set x2;
int main()
{
cin>>T;
while(T--)
{
while(!s.empty())
{
s.pop();
}
cin>>N;
while(N--)
{
cin>>str;
if(str[0]=='P')
{
s.push(ID(Set()));//压空集进栈 Set()代表是一个空集合
}
else if(str[0]=='D')
{
s.push(s.top());
}
else
{
x1=Setcache[s.top()];
s.pop();
x2=Setcache[s.top()];
s.pop();
Set x3;//注意x3必须初始化是一个空集合
if(str[0]=='U') {set_union(ALL(x1),ALL(x2),INSC(x3));}
if(str[0]=='I') {set_intersection(ALL(x1),ALL(x2),INSC(x3));}
if(str[0]=='A') {x3=x2;x3.insert(ID(x1));}
s.push(ID(x3));
}
cout<<Setcache[s.top()].size()<<endl;
}
cout<<"***"<<endl;
}
return 0;
}