Problem3036--集合栈计算机[The SetStack Computer,UVa12096]

3036: 集合栈计算机[The SetStack Computer,UVa12096]

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 0  Solved: 0
[Status] [Submit] [Creator:]

Description

集合论是数学的一个分支,主要由19世纪末的德国数学家康托尔创立。集合理论最初备受争议,但现在它在现代数学中扮演了基础理论的角色,这一理论被用来证明数学中关于数学对象(如数字或函数)及其性质的假设的合理性。集合理论的形式化版本也可以作为证明数学严密性的理论理想的具体说明。鉴于集合的重要性,作为数学的基础,一组古怪的理论家开始构建一台在集合而不是数字上运行的超级计算机。初始的SetStack Alpha正在构建中,他们需要您对其进行模拟,以验证原型的操作。


有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且支持的操作有:PUSH,DUP,UNION,INTERSECT,ADD
操作的具体定义如下:
  • PUSH: 一个空的集合{}入栈
  • DUP: 复制栈顶的集合(把当前栈顶的集合复制一份后再入栈)
  • UNION: 出栈两个集合,然后把两个集合的并集入栈
  • INTERSECT: 出栈两个集合,然后把两个集合的交集入栈
  • ADD: 出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈
每次操作后,输出栈顶集合的大小(即元素的个数),用|S|表示集合S的大小。


例如:假设栈顶的元素是A={{},{{}}},下一个元素是B={{},{{{}}}},所以集合A和B的大小分别是:|A|=2,|B|=2。则:
UNION操作得到{{},{{}},{{{}}}},输出3
INTERSECT操作得到的结果是{{}},输出1
ADD操作得到结果是{{},{{{}}},{{},{{}}}},输出3

Input

输入文件的第一行是一个整数T,表示测试数据的组数,0≤T≤5.
每组测试数据:
第一行是一个整数N,0≤N≤2000
接下来N行,每行一个命令操作,是上述五种操作中的一个。
数据保证操作均能顺利进行(不需要对空栈执行出栈操作)

Output

对输入的每个操作命令输出一行,输出操作后栈顶集合的大小,并且在每组测试数据后输出一行“***”

Sample Input Copy

2
9
PUSH
DUP
ADD
PUSH
ADD
DUP
ADD
DUP
UNION
5
PUSH
PUSH
ADD
PUSH
INTERSECT

Sample Output Copy

0
0
1
0
1
1
2
2
2
***
0
0
1
0
0
***

Source/Category

 UVA level6