SP1835 SETSTACK - The SetStack Computer

题目描述

背景来自 Wikipedia:集合论是数学的一个分支,主要是由德国数学家 Georg Cantor 在 19 世纪末创立的。起初,集合论是有争议的,但现在已经成为了现代数学的基础理论,也就是说,它是一种被引用来证明数学中关于数学对象(如数字或函数)及其属性存在的假设的理论。形式化的集合论版本在证明中具有基础作用,规定了数学严谨性的理论理想。 鉴于集合作为数学基础的重要性,一群古怪的的理论家开始构建一个以集合而不是数字为操作对象的超级计算机。正在建设中的初始 SetStack Alpha 需要您来模拟它,以验证原型的操作。 这台计算机在一个初始为空的集合堆栈上操作。每次操作后,堆栈顶端的集合的基数会被输出。集合 $S$ 的基数表示为 $|S|$,是 $S$ 中的元素数量。SetStack Alpha 的指令集包括 $\tt PUSH$、$\tt DUP$、$\tt UNION$、$\tt INTERSECT$ 和 $\tt ADD$。 - $\tt PUSH$ 将在堆栈上压入一个空集 $\{\}$。 - $\tt DUP$ 将复制堆栈顶端的集合(从堆栈中弹出,然后将该集合两次压入堆栈)。 - $\tt UNION$ 将弹出堆栈两次,然后将两个集合的并集压入堆栈。 - $\tt INTERSECT$ 将弹出堆栈两次,然后将两个集合的交集压入堆栈。 - $\tt ADD$ 将弹出堆栈两次,将第一个集合添加到第二个集合中,然后将结果集合压入堆栈。 为了说明,假设堆栈的最顶层元素是 $A = \{ \{\}, \{\{\}\} \}$,然后是 $B = \{ \{\}, \{\{\{\}\}\} \}$。对于这些集合,我们有 $|A| = 2$ 和 $|B| = 2$。那么: - $\tt UNION$ 将得到集合 $\{ \{\}, \{\{\}\}, \{\{\{\}\}\} \}$。输出是 $3$。 - $\tt INTERSECT$ 将得到集合 $\{ \{\} \}$。输出是 $1$。 - $\tt ADD$ 将得到集合 $\{ \{\}, \{\{\{\}\}\}, \{\{\},\{\{\}\}\} \}$。输出是 $3$。

输入格式

第一行的整数 $0 \le T \le 5$ 给出了测试用例组数。每个测试用例的第一行包含操作数 $0 \le N \le 2000$。然后是 $N$ 行,每行包含五个命令中的一个。保证 SetStack 计算机可以在不弹出空堆栈的情况下执行序列中的所有命令。

输出格式

对于输入中指定的每个操作,将有一行输出,该行包含一个整数。这个整数是对应命令执行后堆栈最顶层元素的基数。每个测试用例后要有一行 $\texttt{***}$(三个星号)。 --- Translated by User 735713.