문자열 회문 질의
시간 제한2초메모리 제한256 MB
블록 이동, 구간 뒤집기, 문자 하나 삽입 연산으로 문자열이 계속 바뀌는 가운데 주어진 부분 문자열이 회문인지 판별한다.
문제
길이가 인 문자열 이 있다. 이면 는 부분 문자열 를 뜻하고, 이면 는 빈 문자열이다.
이 문자열에 질의 개를 주어진 순서대로 처리한다. 질의는 두 종류다.
질문 질의. 정수 , 가 주어진다. 부분 문자열 가 회문인지 판정한다.
변경 질의. 다음 세 가지 중 하나다.
- 정수 , , 가 주어진다. 를 세 조각 , , 으로 자른다. 각 조각은 비어 있을 수 있다. 첫 조각과 마지막 조각을 이어 붙여 을 만들면 의 길이는 이다. 가운데 조각을 의 앞에서 번째 문자 뒤에 끼워 넣어 을 만들고, 를 으로 바꾼다.
- 정수 , 가 주어진다. 부분 문자열 를 뒤집는다.
- 정수 와 문자 가 주어진다. 위치 바로 앞에 를 끼워 넣어 으로 바꾼다.
세 번째 변경 질의는 문자열의 길이를 1 늘린다. 따라서 은 각 질의를 처리하기 직전의 문자열 길이를 뜻한다.
위 질의를 순서대로 처리하는 프로그램을 작성하시오.
입력
첫째 줄에 정수 과 이 공백으로 구분되어 주어진다. (, )
둘째 줄에 초기 문자열을 이루는 문자 개가 주어진다.
다음 개 줄에 질의가 한 줄에 하나씩 주어진다.
- 질문 질의는
Q i j꼴이다. () - 변경 질의 1은
M 1 i j k꼴이다. (, ) - 변경 질의 2는
M 2 i j꼴이다. () - 변경 질의 3은
M 3 i c꼴이고, 는 문자 하나다. ()
각 줄의 은 그 질의를 처리하기 직전의 문자열 길이다. 문자열은 어느 시점에나 영어 소문자로만 이루어진다고 가정해도 된다. 입력은 항상 유효하다고 가정해도 된다.
출력
질문 질의마다 한 줄에 답을 출력한다. 가 회문이면 YES를, 아니면 NO를 출력한다. 따옴표는 출력하지 않는다.
힌트
첫 번째 예제에서 변경 질의가 문자열을 바꾸는 과정은 다음과 같다.
- 처음:
banana M 2 2 3이후:bnaanaM 2 5 6이후:bnaaanM 3 7 b이후:bnaaanbM 1 1 2 4이후:aaanbnb
마지막 변경 질의는 블록 bn을 떼어내고, 남은 문자열 aaanb의 앞 네 글자 뒤에 그 블록을 끼워 넣는다.