만드는 중입니다

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

AC 오토마톤

시간 제한13초메모리 제한1024 MB

요약
트리의 각 노드는 A, C, ? 중 하나이고, 점 갱신 후 ?를 A나 C로 정해 조상이 A이고 자손이 C인 쌍의 최대 개수를 구합니다.
난이도

어려움10점 중 8점

유형
트리, 세그먼트 트리, 동적 계획법
정답자
아직 제출이 없습니다

문제

JB는 AC 오토마톤으로 문제에서 "AC"를 더 많이 얻으려 한다.

AC 오토마톤은 노드 nn개로 이루어진 루트 트리이며, 루트는 1번 노드다. 루트를 제외한 각 노드 ii에는 고유한 부모 p_ip\_i와 문자 s_is\_i가 있다. 문자는 'A', 'C', '?' 중 하나다. 노드 xx가 yy의 조상이라는 것은 x=p_yx = p\_y이거나, xx가 p_yp\_y의 조상인 경우를 말한다. JB가 얻는 "AC"의 개수는 순서쌍 (x,y)(x,y) 중 xx가 yy의 조상이고, s_xs\_x가 'A', s_ys\_y가 'C'인 쌍의 수와 같다. JB는 각 '?'를 'A' 또는 'C'로 바꿀 수 있다. 목표는 모든 '?'를 바꾼 뒤 "AC"의 개수를 최대로 만드는 것이다.

문제는 계속 바뀐다. JB는 AC 오토마톤을 qq번 바꾼다. 매번 노드 xx의 문자를 'A', 'C', '?' 중 하나로 고친다(바뀌지 않을 수도 있다). 각 변경 후에, 모든 '?'를 바꿨을 때 얻을 수 있는 "AC"의 최대 개수를 구하라. JB는 최댓값을 계산하는 동안 실제로 오토마톤을 고치지 않는다. 예시를 참고하라.

입력

첫 번째 줄에 정수 nn과 qq가 주어진다 (1≤n,q≤300 0001\le n, q\le 300\ 000).

두 번째 줄에는 각 노드의 문자를 나타내는 길이 nn의 문자열이 주어진다. 모든 문자는 'A', 'C', '?' 중 하나다.

세 번째 줄에는 n−1n - 1개의 정수가 주어진다. ii번째 정수 p_ip\_i (1≤p_i≤i1\le p\_i \le i)는 노드 i+1i+1의 부모다.

다음 qq개의 줄은 수정을 나타낸다. ii번째 줄에는 정수 xx (1≤x≤n1\le x\le n)와 문자 yy (yy는 'A', 'C', '?' 중 하나)가 주어지며, 이는 노드 xx의 문자를 yy로 바꾼다는 뜻이다.

출력

qq개의 줄을 출력한다. ii번째 줄에는 ii번째 수정 후 "AC"의 최대 개수를 정수 하나로 출력한다.

힌트

첫 번째 수정 후 최적의 치환 중 하나는 "ACCCC"이며, 이때 순서쌍은 4개다: (1,2), (1,3), (1,4), (1,5).

두 번째 수정 후 최적의 치환 중 하나는 "ACCAC"이며, 이때 순서쌍은 3개다: (1,2), (1,3), (1,5).

세 번째 수정 후 최적의 치환 중 하나는 "AACAC"이며, 이때 순서쌍은 3개다: (1,3), (2,3), (1,5).

예제1

  1. 예제 1

    입력
    5 3
    AC??C
    1 2 2 1
    1 ?
    4 A
    2 ?
    
    예상 출력
    4
    3
    3