만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

괄호 문자열 편집기

시간 제한3초메모리 제한2048 MB

요약
커서로 괄호 문자열을 편집하는 과정을 시뮬레이션하고, 문자열이 올바른 괄호 문자열일 때마다 그 연산 번호를 C에 XOR합니다.
난이도

보통10점 중 7점

유형
세그먼트 트리, 연결 리스트, 문자열
정답자
아직 제출이 없습니다

문제

올바른 괄호 문자열은 다음과 같이 정의한다.

  • 빈 문자열 ∅\varnothing은 올바른 괄호 문자열이다.
  • AA가 올바른 괄호 문자열이면, AA를 괄호로 둘러싼 (A)(A)도 올바른 괄호 문자열이다.
  • AA와 BB가 올바른 괄호 문자열이면, 둘을 이어 붙인 ABAB도 올바른 괄호 문자열이다.

텍스트 편집기를 관리하면서 편집기의 텍스트가 올바른 괄호 문자열인지 실시간으로 판정해야 한다. 구현할 편집기는 다음 명세를 따른다.

처음에 편집기의 텍스트는 빈 문자열 ∅\varnothing이다. 편집기에는 커서가 하나 있다. 텍스트가 SS이고 커서의 위치가 jj일 때, 편집기가 지원하는 동작은 다음과 같다.

  • (: SS의 jj번째 문자와 j+1j+1번째 문자 사이에 (를 삽입하고, 커서를 오른쪽으로 1만큼 옮긴다. j=0j=0이면 문자열 맨 앞에, j=∣S∣j=|S|이면 맨 끝에 삽입한다.
  • ): SS의 jj번째 문자와 j+1j+1번째 문자 사이에 )를 삽입하고, 커서를 오른쪽으로 1만큼 옮긴다. j=0j=0이면 문자열 맨 앞에, j=∣S∣j=|S|이면 맨 끝에 삽입한다.
  • <: 커서를 왼쪽으로 1만큼 옮긴다. 단, j=0j=0이면 커서는 움직이지 않는다.
  • >: 커서를 오른쪽으로 1만큼 옮긴다. 단, j=∣S∣j=|S|이면 커서는 움직이지 않는다.
  • X: SS의 jj번째 문자를 삭제하고, 커서를 왼쪽으로 1만큼 옮긴다. j=0j=0이면 아무 일도 일어나지 않는다.

이 동작 정의에 따라 매 순간 0≤j≤∣S∣0 \le j \le |S|가 성립하며, 처음 jj는 0이다.

각 동작을 수행한 뒤 SS가 올바른 괄호 문자열인지 기록해야 한다. 편집기에는 변수 CC가 있으며, 처음 값은 0이다.

ii번째 동작을 수행한 뒤 SS가 올바른 괄호 문자열이면, CC의 값을 C⊕iC \oplus i로 바꾼다. 여기서 ⊕\oplus는 비트 XOR이다.

명세대로 편집기를 구현한 뒤, QQ개의 동작을 모두 수행하고 마지막에 얻은 CC의 값을 출력하는 프로그램을 작성하라.

입력

첫 번째 줄에 수행할 동작의 수 QQ가 주어진다. (1≤Q≤10 000 0001 \le Q \le 10\,000\,000)

두 번째 줄에 수행할 동작을 순서대로 늘어놓은 길이 QQ의 문자열 PP가 주어진다.

출력

QQ개의 동작을 모두 수행한 뒤 얻은 CC의 값을 한 줄에 출력한다.

힌트

예제 입출력에서 각 동작을 수행한 후 텍스트, 커서, 변수 CC의 상태는 아래와 같다.

동작편집기의 텍스트커서의 위치올바른 괄호 문자열?CC
)")"11아니오00
<")"00아니오00
("()"11네33
<"()"00네77
("(()"11아니오77
)"()()"22네11
X"(()"11아니오11
("((()"22아니오11
)"(()()"33아니오11
)"(())()"44네1111

예제1

  1. 예제 1

    입력
    10
    )<(<()X())
    
    예상 출력
    11