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

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

회문

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

요약
두 문자열을 지정된 순서로 이어 붙일 때마다, 결과 0과 1 문자열에 있는 서로 다른 회문 부분 문자열의 개수를 출력합니다.
난이도

어려움10점 중 9점

유형
문자열, 문자열 매칭, 트리
정답자
아직 제출이 없습니다

문제

길이가 nn인, 문자 0 또는 1로 이루어진 문자열이 주어진다. 문자에는 1,2,...,n1, 2, ..., n의 번호가 붙어 있다. 처음에는 각 문자가 길이 1인 문자열 하나를 나타낸다.

연결은 두 단어 aa와 bb를 골라 지운 뒤, bb의 문자가 aa의 문자 뒤에 오도록 이어 붙인 문자열 abab로 바꾸는 연산이다.

nn개의 초기 문자열은 n−1n-1번의 연결을 거쳐 하나의 최종 문자열이 된다. ii번째 연결은 (ai,bi)(a_i, b_i) 쌍으로 주어지며, aia_i번째 문자가 속한 문자열과 bib_i번째 문자가 속한 문자열을 잇는다는 뜻이다. aia_i번째 문자와 bib_i번째 문자는 같은 문자열에 속하지 않는다고 보장된다.

문자열 ww의 회문 값은 ww의 부분 문자열 가운데 회문인 것의 서로 다른 개수이다. 회문은 앞에서 읽든 뒤에서 읽든 같은 문자열이다. 부분 문자열은 문자열의 앞이나 뒤에서 문자를 0개 이상 지워서 얻는 문자열이다.

각 연결 후에 만들어진 문자열의 회문 값을 출력한다.

입력

첫째 줄에 문자의 개수 nn (1≤n≤1000001 \le n \le 100000)이 주어진다.

둘째 줄에는 초기 문자열을 나타내는 nn개의 0과 1로 이루어진 문자열이 주어진다.

이후 n−1n-1개의 줄 각각에 ii번째 연결을 나타내는 두 정수 aia_i, bib_i (1≤ai,bi≤n1 \le a_i, b_i \le n, ai≠bia_i \ne b_i)가 주어진다.

출력

n−1n-1개의 줄을 출력한다. ii번째 줄에는 ii번째 연결 후 얻은 단어의 회문 값을 출력한다.

힌트

세 번째 입력에서 연결할 때마다 새로 만들어지는 문자열은 차례로 00, 10, 00, 100, 1000, 001000, 00100010이다. 각각의 회문 값은 2, 2, 2, 3, 4, 6, 8이다.

예를 들어 00100010의 회문 값은 8이다. 이 문자열에는 회문인 부분 문자열이 8개 있다. 그것은 0, 00, 000, 10001, 0100010, 1, 010, 00100이다.

예제3

  1. 예제 1

    입력
    3
    010
    1 2
    2 3
    
    예상 출력
    2
    3
    
  2. 예제 2

    입력
    5
    00111
    4 1
    1 5
    2 1
    3 1
    
    예상 출력
    2
    3
    4
    5
    
  3. 예제 3

    입력
    8
    10010000
    7 5
    4 2
    3 6
    1 3
    6 8
    5 3
    1 2
    
    예상 출력
    2
    2
    2
    3
    4
    6
    8