그룹 부분 문자열과 쿼리

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

요약
0과 1로만 이루어진 문자열 X의 끝에 같은 문자를 묶음으로 이어 붙이면서, 매 질문마다 앞뒤를 지워 얻을 수 있는 서로 다른 그룹 부분 문자열의 개수를 구한다.
난이도

어려움10점 중 9점

유형
문자열, 수학, 조합론, 구현
정답자
아직 제출이 없습니다

문제

'0'과 '1'만으로 이루어진 길이 11 이상의 문자열 AA가 다음 조건 중 하나를 만족하는 경우, 이러한 AA를 그룹 문자열이라고 부릅니다.

  • AA에 '0'이 등장하지 않거나 '1'이 등장하지 않습니다.
  • AA에서 모든 '0'은 모든 '1'보다 먼저 등장합니다.
  • AA에서 모든 '1'은 모든 '0'보다 먼저 등장합니다.

예를 들어, "000", "11", "00111", "110"은 그룹 문자열이지만, "1011"이나 "00100"은 그룹 문자열이 아닙니다.

'0'과 '1'만으로 이루어진 문자열 SS에 대해, SS의 처음과 끝에서 문자를 원하는 만큼 지워 만들 수 있는 서로 다른 그룹 문자열의 개수를 f(S)f(S)라고 정의합니다. 예를 들어, SS가 "10110"일 때 만들 수 있는 그룹 문자열은 "0", "01", "011", "1", "10", "11", "110"이 있습니다. 그러므로 SS가 "10110"일 때 f(S)f(S)의 값은 77입니다. 이때 "10"이 SS에 여러 번 등장하지만 f(S)f(S)를 구하는 데는 한 번만 세는 것에 유의하세요.

여러분에게 문자열 XX에 대한 QQ번의 질문이 주어집니다. 초기에 문자열 XX는 빈 문자열입니다. 각 질문은 다음과 같은 형태입니다.

  • cc kk: 문자열 XX의 끝에 문자 cc를 kk개 붙입니다. 그후 f(X)f(X)의 값을 구합니다.

이때 질문으로 문자열 XX에 추가된 문자는 그다음 질문이 주어질 때에도 문자열 XX에서 지워지지 않고 남아있습니다.

여러분은 각 질문에 대해 충분히 빨리 대답할 수 있을까요?

입력

첫 번째 줄에 정수 QQ가 주어집니다.

두 번째 줄부터 QQ개의 줄에 걸쳐 각 줄에 질문에 대응되는 문자 c_ic\_i와 양의 정수 k_ik\_i가 주어집니다.

출력

QQ개의 줄에 걸쳐 각 줄에 질문에 대한 정답을 출력합니다.

제한

  • 1≤Q≤200,0001 \le Q \le 200\\,000
  • 각 1≤i≤Q1 \le i \le Q에 대해 c_ic\_i는 '0' 또는 '1'
  • 각 1≤i≤Q1 \le i \le Q에 대한 k_ik\_i의 합은 1,000,000,0001\\,000\\,000\\,000 이하

힌트

예제의 각 질문에 대해 새로운 문자열 XX의 내용, 새롭게 만들 수 있는 그룹 문자열, 그리고 f(X)f(X)의 값은 다음과 같습니다.

질문문자열 XX새롭게 만들 수 있는 그룹 문자열f(X)f(X)
1 11"1""1"11
0 11"10""0", "10"33
1 22"1011""01", "011", "11"66
0 11"10110""110"77
1 22"1011011"없음77
1 22"101101111""0111", "01111", "111", "1111"1111

예제1

  1. 예제 1

    입력
    6
    1 1
    0 1
    1 2
    0 1
    1 2
    1 2
    
    예상 출력
    1
    3
    6
    7
    7
    11