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

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

문자열 회문 질의

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

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

어려움10점 중 10점

유형
문자열, 문자열 매칭, 구현
정답자
아직 제출이 없습니다

문제

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

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

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

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

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

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

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

입력

첫째 줄에 정수 nn과 mm이 공백으로 구분되어 주어진다. (1≤n≤1051 \le n \le 10^5, 1≤m≤1051 \le m \le 10^5)

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

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

  • 질문 질의는 Q i j 꼴이다. (1≤i≤j≤n1 \le i \le j \le n)
  • 변경 질의 1은 M 1 i j k 꼴이다. (1≤i≤j≤n1 \le i \le j \le n, 0≤k≤n−(j−i+1)0 \le k \le n - (j - i + 1))
  • 변경 질의 2는 M 2 i j 꼴이다. (1≤i≤j≤n1 \le i \le j \le n)
  • 변경 질의 3은 M 3 i c 꼴이고, cc는 문자 하나다. (1≤i≤n+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의 앞 네 글자 뒤에 그 블록을 끼워 넣는다.

예제2

  1. 예제 1

    입력
    6 10
    banana
    Q 2 6
    Q 2 5
    M 2 2 3
    Q 2 5
    M 2 5 6
    Q 1 6
    M 3 7 b
    Q 1 7
    M 1 1 2 4
    Q 4 7
    
    예상 출력
    YES
    NO
    YES
    NO
    YES
    NO
    
  2. 예제 2

    입력
    5 8
    abcba
    Q 1 5
    M 1 1 1 4
    Q 1 4
    M 1 5 5 0
    Q 1 5
    M 3 1 x
    Q 1 6
    Q 2 6
    
    예상 출력
    YES
    NO
    YES
    NO
    YES