아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

집합 스택 컴퓨터

시간 제한1초메모리 제한128 MB

요약
집합을 원소로 갖는 재귀적 집합 구조를 스택으로 시뮬레이션하며 다섯 가지 연산 후 최상단 집합의 크기를 출력하는 문제입니다.
난이도

보통10점 중 6점

유형
해시맵, 스택, 시뮬레이션, 재귀
정답자
아직 제출이 없습니다

문제

한 이론가 집단이 숫자가 아니라 집합을 다루는 슈퍼컴퓨터를 만들고 있습니다. 여러분은 그 시제품인 SetStack Alpha의 동작을 시뮬레이션해야 합니다.

이 기계는 집합들을 담는 스택 하나를 가지며, 처음에는 비어 있습니다. 매 연산이 끝날 때마다 스택 맨 위 집합의 원소 개수를 출력합니다. 집합 SS의 원소 개수(크기)는 ∣S∣|S|로 표기합니다.

명령어는 다섯 가지입니다.

  • PUSH — 빈 집합 {}를 스택에 넣습니다.
  • DUP — 맨 위 집합을 복제합니다(맨 위를 꺼낸 뒤 같은 집합을 두 번 넣습니다).
  • UNION — 맨 위 두 집합을 꺼내고, 두 집합의 합집합을 넣습니다.
  • INTERSECT — 맨 위 두 집합을 꺼내고, 두 집합의 교집합을 넣습니다.
  • ADD — 맨 위 두 집합을 꺼내고, 첫 번째(위쪽) 집합을 두 번째(아래쪽) 집합의 원소 하나로 추가한 결과를 넣습니다.

집합은 다른 집합을 원소로 가질 수 있으며, 완전히 같은 원소들로 이루어진 두 집합은 서로 같은 것으로 봅니다.

예를 들어 스택의 맨 위가 A = { {}, {{}} }이고 그 아래가 B = { {}, {{{}}} }라면 ∣A∣=2|A| = 2, ∣B∣=2|B| = 2입니다. 이때:

  • UNION의 결과는 { {}, {{}}, {{{}}} }이고, 출력은 3입니다.
  • INTERSECT의 결과는 { {} }이고, 출력은 1입니다.
  • ADD의 결과는 { {}, {{{}}}, {{}, {{}}} }이고, 출력은 3입니다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어집니다(0≤T≤50 \le T \le 5).

각 테스트 케이스의 첫째 줄에는 연산의 개수 NN이 주어집니다(0≤N≤20000 \le N \le 2000). 이어지는 NN개의 줄에는 각각 다섯 명령어 중 하나가 주어집니다.

주어진 명령어들을 실행하는 동안 빈 스택에서 원소를 꺼내는 일은 절대 발생하지 않음이 보장됩니다.

출력

각 연산마다 한 줄에 정수 하나를 출력합니다. 이 값은 해당 명령을 실행한 뒤 스택 맨 위 집합의 원소 개수입니다.

각 테스트 케이스가 끝날 때마다 ***(별표 세 개)만 있는 줄을 출력합니다.

예제1

  1. 예제 1

    입력
    2
    9
    PUSH
    DUP
    ADD
    PUSH
    ADD
    DUP
    ADD
    DUP
    UNION
    5
    PUSH
    PUSH
    ADD
    PUSH
    INTERSECT
    
    예상 출력
    0
    0
    1
    0
    1
    1
    2
    2
    2
    ***
    0
    0
    1
    0
    0
    ***