문자열 회문 질의

블록 이동, 구간 뒤집기, 문자 하나 삽입 연산으로 문자열이 계속 바뀌는 가운데 주어진 부분 문자열이 회문인지 판별한다.

어려움10문자열문자열 매칭구현아직 제출이 없습니다시간 제한2초메모리 제한256 MB

문제

길이가 nn인 문자열 S=s1s2snS = s_1 s_2 \dots s_n이 있다. xyx \le y이면 Sx,yS_{x,y}는 부분 문자열 sxsys_x \dots s_y를 뜻하고, x>yx > y이면 Sx,yS_{x,y}는 빈 문자열이다.

이 문자열에 질의 mm개를 주어진 순서대로 처리한다. 질의는 두 종류다.

질문 질의. 정수 ii, jj가 주어진다. 부분 문자열 Si,jS_{i,j}가 회문인지 판정한다.

변경 질의. 다음 세 가지 중 하나다.

  1. 정수 ii, jj, kk가 주어진다. SS를 세 조각 S1,i1S_{1,i-1}, Si,jS_{i,j}, Sj+1,nS_{j+1,n}으로 자른다. 각 조각은 비어 있을 수 있다. 첫 조각과 마지막 조각을 이어 붙여 T=S1,i1Sj+1,nT = S_{1,i-1} S_{j+1,n}을 만들면 TT의 길이는 n=n(ji+1)n' = n - (j - i + 1)이다. 가운데 조각을 TT의 앞에서 kk번째 문자 뒤에 끼워 넣어 S=T1,kSi,jTk+1,nS' = T_{1,k} S_{i,j} T_{k+1,n'}을 만들고, SSSS'으로 바꾼다.
  2. 정수 ii, jj가 주어진다. 부분 문자열 Si,jS_{i,j}를 뒤집는다.
  3. 정수 ii와 문자 cc가 주어진다. 위치 ii 바로 앞에 cc를 끼워 넣어 S=S1,i1cSi,nS = S_{1,i-1} c S_{i,n}으로 바꾼다.

세 번째 변경 질의는 문자열의 길이를 1 늘린다. 따라서 nn은 각 질의를 처리하기 직전의 문자열 길이를 뜻한다.

위 질의를 순서대로 처리하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 nnmm이 공백으로 구분되어 주어진다. (1n1051 \le n \le 10^5, 1m1051 \le m \le 10^5)

둘째 줄에 초기 문자열을 이루는 문자 nn개가 주어진다.

다음 mm개 줄에 질의가 한 줄에 하나씩 주어진다.

  • 질문 질의는 Q i j 꼴이다. (1ijn1 \le i \le j \le n)
  • 변경 질의 1은 M 1 i j k 꼴이다. (1ijn1 \le i \le j \le n, 0kn(ji+1)0 \le k \le n - (j - i + 1))
  • 변경 질의 2는 M 2 i j 꼴이다. (1ijn1 \le i \le j \le n)
  • 변경 질의 3은 M 3 i c 꼴이고, cc는 문자 하나다. (1in+11 \le i \le n + 1)

각 줄의 nn은 그 질의를 처리하기 직전의 문자열 길이다. 문자열은 어느 시점에나 영어 소문자로만 이루어진다고 가정해도 된다. 입력은 항상 유효하다고 가정해도 된다.

출력

질문 질의마다 한 줄에 답을 출력한다. Si,jS_{i,j}가 회문이면 YES를, 아니면 NO를 출력한다. 따옴표는 출력하지 않는다.

힌트

첫 번째 예제에서 변경 질의가 문자열을 바꾸는 과정은 다음과 같다.

  • 처음: S=S = banana
  • M 2 2 3 이후: S=S = bnaana
  • M 2 5 6 이후: S=S = bnaaan
  • M 3 7 b 이후: S=S = bnaaanb
  • M 1 1 2 4 이후: S=S = aaanbnb

마지막 변경 질의는 블록 bn을 떼어내고, 남은 문자열 aaanb의 앞 네 글자 뒤에 그 블록을 끼워 넣는다.