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

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

Born Slippy

시간 제한6초메모리 제한256 MB

요약
루트 트리의 각 정점에서 조상 방향으로 올라가며 연속한 두 가중치를 AND, OR, XOR로 결합할 때 얻는 최댓값을 구하고, 이를 가중 합으로 출력한다.
난이도

어려움10점 중 9점

유형
트리, 동적 계획법, 비트 연산, DFS
정답자
아직 제출이 없습니다

문제

Zhang 교수는 정점이 1,2,…,n1, 2, \ldots, n으로 번호가 매겨진 루트 있는 트리를 가지고 있다. ii번 정점에는 정수 가중치 w_iw\_i가 있다.

각 s∈{1,2,…,n}s \in \{1, 2, \ldots, n\}에 대해, Zhang 교수는 다음 조건을 만족하는 정점 수열 v_1,v_2,…,v_mv\_1, v\_2, \ldots, v\_m을 찾으려 한다.

  • v_1=sv\_1 = s이고, 각 1<i≤m1 < i \le m에 대해 v_iv\_i는 v_i−1v\_{i - 1}의 조상이다.
  • 값 f(s)=w_v_1+∑_i=2m(w_v_iopw_v_i−1)f(s) = w\_{v\_1} + \sum\limits\_{i = 2}^{m} (w\_{v\_i} \mathrm{op} w\_{v\_{i - 1}})가 최대가 된다. 여기서 연산 xopyx \mathrm{op} y는 두 정수의 비트 AND, OR, XOR 연산이다.

입력

여러 개의 테스트 케이스가 주어진다. 입력의 첫째 줄에는 테스트 케이스의 수를 나타내는 정수 TT가 주어진다. 각 테스트 케이스는 다음과 같다.

첫째 줄에는 정수 nn과 문자열 op\mathrm{op}가 주어진다 (2≤n≤2162 \le n \le 2^{16}, op∈{AND,OR,XOR}\mathrm{op} \in \{\mathtt{AND}, \mathtt{OR}, \mathtt{XOR}\}). nn은 정점의 수이고 op\mathrm{op}는 연산이다. 둘째 줄에는 nn개의 정수 w_1,w_2,…,w_nw\_1, w\_2, \ldots, w\_n이 주어진다 (0≤w_i<2160 \le w\_i < 2^{16}). 셋째 줄에는 n−1n - 1개의 정수 p_2,p_3,…,p_np\_2, p\_3, \ldots, p\_n이 주어지며, p_ip\_i는 정점 ii의 부모이다 (1≤p_i<i1 \le p\_i < i).

테스트 케이스는 약 300300개이고, 모든 테스트 케이스에서 nn의 합은 10610^6을 넘지 않는다.

출력

각 테스트 케이스에 대해 정수 S=(∑_i=1ni⋅f(i))S = (\sum\limits\_{i = 1}^{n}{i \cdot f(i)})를 109+710^9 + 7로 나눈 나머지를 출력한다.

예제1

  1. 예제 1

    입력
    3
    5 AND
    5 4 3 2 1
    1 2 2 4
    5 XOR
    5 4 3 2 1
    1 2 2 4
    5 OR
    5 4 3 2 1
    1 2 2 4
    
    예상 출력
    91
    139
    195