선형화
시간 제한2초메모리 제한512 MB
길이가 2의 거듭제곱인 각 부분 문자열에서 연속 구간 뒤집기 횟수를 최소로 하여 AND의 패리티 패턴으로 만드는 문제로, 인접한 문자가 다른 위치의 개수를 이용해 답을 구한다.
문제
두 음이 아닌 정수의 비트 단위 and는 다음과 같이 계산한다. 두 수를 이진법으로 쓰면, 결과의 번째 이진 자릿수는 두 인수의 번째 자릿수가 모두 일 때 이다. 예를 들어 이다.
두 이진 자릿수의 배타적 논리합(xor)은 두 자릿수가 다르면 , 같으면 이다. 따라서 , , , 이다.
음이 아닌 정수 에 대한 패리티 함수 는 의 이진 표현에서 의 개수가 홀수이면 , 짝수이면 이다. 예를 들어 , 이다.
길이가 2의 거듭제곱인 이진 문자열 을 생각하자. 여기서 이다. 인 정수 와 이진 자릿수 가 존재하여 모든 (부터 까지)에 대해 가 성립하면 이 문자열을 선형이라 한다.
예를 들어 문자열 "1100"은 선형이다. , 을 택하면 된다.
한편 "0001"은 선형이 아니다. 어떤 를 택하더라도 이므로 이다. 이고 이므로 이다. 그런데 이다.
이진 문자열을 생각하자. 한 번의 행동으로 연속한 자릿수 구간을 택해 뒤집을 수 있다. 즉 모든 0을 1로, 1을 0으로 바꾼다. 이 문자열의 선형화 난이도를 선형으로 만들기 위해 필요한 최소 행동 횟수라 하자.
예를 들어 문자열 "0001"의 선형화 난이도는 이다. 왼쪽 세 자릿수를 뒤집어 문자열 "1111"을 얻으면 , 로 선형이다. 한 번의 행동으로 선형화하는 다른 방법도 있다.
문자열 와 개의 질의 가 주어진다. 각 질의에서 의 번째 자릿수부터 번째 자릿수까지(양 끝 포함)의 부분 문자열을 생각한다. 의 자릿수는 왼쪽부터 부터 시작하여 번호를 매긴다. 각 질의의 길이는 2의 거듭제곱임이 보장된다. 주어진 모든 부분 문자열의 선형화 난이도를 계산하라.
입력
첫째 줄에 문자열 의 길이 이 주어진다(). 둘째 줄에 길이 의 이진 문자열 가 주어진다.
다음 줄에 질의의 수 가 주어진다(). 다음 개 줄에 두 정수 , 가 주어진다(, , 부분 문자열의 길이는 2의 거듭제곱).
출력
각 질의마다 의 해당 부분 문자열의 선형화 난이도를 한 줄에 하나씩 출력한다.
힌트
첫 번째 질의에서는 전체 문자열을 선형화해야 한다. 예를 들어 번째부터 번째 자릿수까지의 구간을 뒤집어 문자열 "00001011"을 얻고, 이어서 번째 자릿수를 뒤집어 "00001111"을 얻으면 , 으로 선형이다.
두 번째 질의에서 문자열 "0001"은 문제 설명에서처럼 한 번의 행동으로 선형화할 수 있다.
세 번째 질의에서 문자열 "0000"은 , 으로 이미 선형이다.