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

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

선형화

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

요약
길이가 2의 거듭제곱인 각 부분 문자열에서 연속 구간 뒤집기 횟수를 최소로 하여 AND의 패리티 패턴으로 만드는 문제로, 인접한 문자가 다른 위치의 개수를 이용해 답을 구한다.
난이도

어려움10점 중 8점

유형
비트 연산, 누적 합, 분할 정복, 수학
정답자
아직 제출이 없습니다

문제

두 음이 아닌 정수의 비트 단위 and는 다음과 같이 계산한다. 두 수를 이진법으로 쓰면, 결과의 ii번째 이진 자릿수는 두 인수의 ii번째 자릿수가 모두 11일 때 11이다. 예를 들어 (14 and 7)=(1110_2 and 0111_2)=110_2=6(14 \text{ and } 7) = (1110\_2 \text{ and } 0111\_2) = 110\_2 = 6이다.

두 이진 자릿수의 배타적 논리합(xor)은 두 자릿수가 다르면 11, 같으면 00이다. 따라서 0 xor 0=00 \text{ xor } 0 = 0, 0 xor 1=10 \text{ xor } 1 = 1, 1 xor 0=11 \text{ xor } 0 = 1, 1 xor 1=01 \text{ xor } 1 = 0이다.

음이 아닌 정수 xx에 대한 패리티 함수 P(x)P(x)는 xx의 이진 표현에서 11의 개수가 홀수이면 11, 짝수이면 00이다. 예를 들어 P(5)=P(101_2)=0P(5) = P(101\_2) = 0, P(7)=P(111_2)=1P(7) = P(111\_2) = 1이다.

길이가 2의 거듭제곱인 이진 문자열 s=s_0s_1…s_n−1s = s\_0s\_1\ldots s\_{n-1}을 생각하자. 여기서 n=2kn = 2^k이다. 0≤x<n0 \le x < n인 정수 xx와 이진 자릿수 bb가 존재하여 모든 ii(00부터 n−1n-1까지)에 대해 s_i=P(i and x) xor bs\_i = P(i \text{ and } x) \text{ xor } b가 성립하면 이 문자열을 선형이라 한다.

예를 들어 문자열 "1100"은 선형이다. x=2=10_2x = 2 = 10\_2, b=1b = 1을 택하면 된다.

  • s_0=P(0 and 2) xor 1=P(0) xor 1=0 xor 1=1s\_0 = P(0 \text{ and } 2) \text{ xor } 1 = P(0) \text{ xor } 1 = 0 \text{ xor } 1 = 1
  • s_1=P(1 and 2) xor 1=P(0) xor 1=0 xor 1=1s\_1 = P(1 \text{ and } 2) \text{ xor } 1 = P(0) \text{ xor } 1 = 0 \text{ xor } 1 = 1
  • s_2=P(2 and 2) xor 1=P(2) xor 1=1 xor 1=0s\_2 = P(2 \text{ and } 2) \text{ xor } 1 = P(2) \text{ xor } 1 = 1 \text{ xor } 1 = 0
  • s_3=P(3 and 2) xor 1=P(2) xor 1=1 xor 1=0s\_3 = P(3 \text{ and } 2) \text{ xor } 1 = P(2) \text{ xor } 1 = 1 \text{ xor } 1 = 0

한편 "0001"은 선형이 아니다. 어떤 xx를 택하더라도 P(0 and x)=P(0)=0P(0 \text{ and } x) = P(0) = 0이므로 b=0b = 0이다. 0=P(1 and x)0 = P(1 \text{ and } x)이고 0=P(2 and x)0 = P(2 \text{ and } x)이므로 x=0x = 0이다. 그런데 P(3 and 0)=0≠s_3=1P(3 \text{ and } 0) = 0 \ne s\_3 = 1이다.

이진 문자열을 생각하자. 한 번의 행동으로 연속한 자릿수 구간을 택해 뒤집을 수 있다. 즉 모든 0을 1로, 1을 0으로 바꾼다. 이 문자열의 선형화 난이도를 선형으로 만들기 위해 필요한 최소 행동 횟수라 하자.

예를 들어 문자열 "0001"의 선형화 난이도는 11이다. 왼쪽 세 자릿수를 뒤집어 문자열 "1111"을 얻으면 x=0x = 0, b=1b = 1로 선형이다. 한 번의 행동으로 선형화하는 다른 방법도 있다.

문자열 tt와 qq개의 질의 (l_i,r_i)(l\_i, r\_i)가 주어진다. 각 질의에서 tt의 l_il\_i번째 자릿수부터 r_ir\_i번째 자릿수까지(양 끝 포함)의 부분 문자열을 생각한다. tt의 자릿수는 왼쪽부터 00부터 시작하여 번호를 매긴다. 각 질의의 길이는 2의 거듭제곱임이 보장된다. 주어진 모든 부분 문자열의 선형화 난이도를 계산하라.

입력

첫째 줄에 문자열 tt의 길이 mm이 주어진다(1≤m≤200 0001 \le m \le 200\,000). 둘째 줄에 길이 mm의 이진 문자열 tt가 주어진다.

다음 줄에 질의의 수 qq가 주어진다(1≤q≤200 0001 \le q \le 200\,000). 다음 qq개 줄에 두 정수 l_il\_i, r_ir\_i가 주어진다(0≤l_i≤r_i<m0 \le l\_i \le r\_i < m, r_i−l_i+1≥2r\_i - l\_i + 1 \ge 2, 부분 문자열의 길이는 2의 거듭제곱).

출력

각 질의마다 tt의 해당 부분 문자열의 선형화 난이도를 한 줄에 하나씩 출력한다.

힌트

첫 번째 질의에서는 전체 문자열을 선형화해야 한다. 예를 들어 44번째부터 66번째 자릿수까지의 구간을 뒤집어 문자열 "00001011"을 얻고, 이어서 55번째 자릿수를 뒤집어 "00001111"을 얻으면 x=4x = 4, b=0b = 0으로 선형이다.

두 번째 질의에서 문자열 "0001"은 문제 설명에서처럼 한 번의 행동으로 선형화할 수 있다.

세 번째 질의에서 문자열 "0000"은 x=0x = 0, b=0b = 0으로 이미 선형이다.

예제1

  1. 예제 1

    입력
    8
    00000101
    3
    0 7
    2 5
    0 3
    
    예상 출력
    2
    1
    0