블록 이동, 구간 뒤집기, 문자 하나 삽입 연산으로 문자열이 계속 바뀌는 가운데 주어진 부분 문자열이 회문인지 판별한다.
어려움10문자열문자열 매칭구현아직 제출이 없습니다시간 제한2초메모리 제한256 MB길이가 n인 문자열 S=s1s2…sn이 있다. x≤y이면 Sx,y는 부분 문자열 sx…sy를 뜻하고, x>y이면 Sx,y는 빈 문자열이다.
이 문자열에 질의 m개를 주어진 순서대로 처리한다. 질의는 두 종류다.
질문 질의. 정수 i, j가 주어진다. 부분 문자열 Si,j가 회문인지 판정한다.
변경 질의. 다음 세 가지 중 하나다.
세 번째 변경 질의는 문자열의 길이를 1 늘린다. 따라서 n은 각 질의를 처리하기 직전의 문자열 길이를 뜻한다.
위 질의를 순서대로 처리하는 프로그램을 작성하시오.
첫째 줄에 정수 n과 m이 공백으로 구분되어 주어진다. (1≤n≤105, 1≤m≤105)
둘째 줄에 초기 문자열을 이루는 문자 n개가 주어진다.
다음 m개 줄에 질의가 한 줄에 하나씩 주어진다.
Q i j 꼴이다. (1≤i≤j≤n)M 1 i j k 꼴이다. (1≤i≤j≤n, 0≤k≤n−(j−i+1))M 2 i j 꼴이다. (1≤i≤j≤n)M 3 i c 꼴이고, c는 문자 하나다. (1≤i≤n+1)각 줄의 n은 그 질의를 처리하기 직전의 문자열 길이다. 문자열은 어느 시점에나 영어 소문자로만 이루어진다고 가정해도 된다. 입력은 항상 유효하다고 가정해도 된다.
질문 질의마다 한 줄에 답을 출력한다. Si,j가 회문이면 YES를, 아니면 NO를 출력한다. 따옴표는 출력하지 않는다.
첫 번째 예제에서 변경 질의가 문자열을 바꾸는 과정은 다음과 같다.
bananaM 2 2 3 이후: S= bnaanaM 2 5 6 이후: S= bnaaanM 3 7 b 이후: S= bnaaanbM 1 1 2 4 이후: S= aaanbnb마지막 변경 질의는 블록 bn을 떼어내고, 남은 문자열 aaanb의 앞 네 글자 뒤에 그 블록을 끼워 넣는다.