페이지를 불러오는 중…
해결한 사람
1
명
정답률
100.00
%
시간 제한
1000
ms
메모리 제한
2048
MB
그레이스는 생물학자로 싱가폴에 있는 바이오인포매틱스 회사를 다니고 있다. 그녀가 하는 일 중에는 다양한 생물체의 DNA 서열을 분석하는 일도 있다. DNA 서열이란 A, T, C 세 가지 문자로 구성된 문자열로 정의된다. 주의할 점은, 본 문제에서 DNA 서열은 문자 G를 포함하지 않는다.
DNA 서열의 두 원소가 서로 교환되는 연산을 돌연변이 연산이라고 정의하자. 예를 들어, 다음 서열에서 강조된 A와 C를 서로 교환하는 한 번의 돌연변이 연산을 통해 ACTA를 AATC로 변환할 수 있다.
두 서열 사이의 돌연변이 거리는 하나의 서열을 다른 서열로 변환하는 데 필요한 돌연변이 연산의 최소 횟수로 정의되며, 만약 하나의 서열을 다른 서열로 돌연변이 연산으로 변환할 수 없는 경우에는 로 정의된다.
그레이스는 두 DNA 서열 와 를 분석하고 있다. 와 는 둘 다 개의 원소로 구성되어 있고 각 원소는 부터 까지 번호가 붙어 있다. 당신이 해야 할 일은 그레이스가 개의 다음과 같은 질문에 답하도록 돕는 것이다: 부분 문자열 와 부분 문자열 사이의 돌연변이 거리가 얼마인가? 여기에서, DNA 서열 의 부분 문자열 란 번부터 번까지 의 연속된 문자들의 서열로 정의된다. 즉, 는 서열 이다.
다음 함수들을 구현해야 한다.
void init(string a, string b)
a, b: 길이 인 문자열로, 분석해야 할 두 DNA 서열을 의미한다.get_distance를 호출하기 전에 정확하게 한 번 호출된다.int get_distance(int x, int y)
x, y: 분석해야 할 부분 문자열의 시작과 끝 번호.다음 호출을 생각해 보자:
init("ATACAT", "ACTATA")
우선 그레이더가 다음을 호출하는 경우를 보자.
get_distance(1, 3)
이 호출은 과 , 즉 TAC와 CTA 사이의 돌연변이 거리를 리턴해야 한다. TAC는 두 번의 돌연변이 연산을 통해 CTA로 변환될 수 있다: , 그 후 . 두 번보다 적은 횟수의 돌연변이 연산으로 변환하는 것은 불가능하다.
따라서 이 호출은 를 리턴해야 한다.
다음, 그레이더가 다음을 호출하는 경우를 보자.
get_distance(4, 5)
이 호출은 AT와 TA 사이의 돌연변이 거리를 리턴해야 한다. AT는 한 번의 돌연변이 연산을 통해 TA로 변환될 수 있고, 분명히 최소 한 번의 돌연변이 연산이 필요하다.
따라서 이 호출은 을 리턴해야 한다.
마지막으로, 그레이더가 다음을 호출하는 경우를 보자.
get_distance(3, 5)
어떤 돌연변이 연산들을 이용하더라도 서열 CAT를 ATA로 변환할 수 있는 방법이 없으므로, 이 호출은 을 리턴해야 한다.
A, T, C 중의 하나이다.A 또는 T이다.A 또는 T이다.line 1: n q line 2: a line 3: b line 4 + i (0 ≤ i ≤ q - 1): x y (i번째 get_distance 호출을 위한 x와 y임)
샘플 그레이더는 다음 형식으로 답을 출력한다:
line 1 + i (0 ≤ i ≤ q - 1): i번째 get_distance 호출의 리턴 값
6 3
ATACAT
ACTATA
1 3
4 5
3 5
2
1
-1
샘플 그레이더는 다음 형식으로 입력을 읽는다:
International Olympiad in Informatics (IOI) 2021, official task package and official Korean statement.
Reporch에서 한국어 번역, 수식 표기, 이미지 호스팅 및 형식을 수정했습니다.
로그인 상태를 확인하는 중입니다.