만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

텍스트 편집기

시간 제한1초메모리 제한150 MB

요약
삽입, 삭제, 잘라내기, 붙여넣기, 실행 취소와 다시 실행을 지원하는 텍스트 편집기를 구현합니다.
난이도

어려움10점 중 9점

유형
트리, 구현, 시뮬레이션
정답자
아직 제출이 없습니다

문제

이 문제는 두 번 실행되는 문제입니다. 각 테스트에서 제출한 풀이가 두 번 실행됩니다. 자세한 내용은 문제 설명의 나머지 부분과 입력 형식 절을 참고하세요.

문자 값이 3333 이상 126126 이하인 문자열을 다루는 간단한 텍스트 편집기를 구현하는 것이 과제입니다. 문자열의 길이는 언제나 263−12^{63} - 1 이하가 보장됩니다. 명령의 모든 인자는 00부터 시작하는 인덱스이고, 모든 구간은 반개구간입니다. 즉 ℓ\ell은 포함되고 rr은 포함되지 않습니다. 모든 구간은 비어 있지 않으며, 모든 위치와 구간은 범위 안에 있습니다. 클립보드는 처음에 비어 있습니다.

  • insert pp str\mathit{str}: 파일의 pp번째 위치에 문자열 str\mathit{str}을 삽입합니다. 모든 str\mathit{str}의 길이 합은 10610^6 이하입니다.
  • erase ℓ\ell rr: 파일의 ℓ\ell번째 문자부터 rr번째 문자까지의 내용을 지웁니다.
  • print ℓ\ell rr: 파일의 ℓ\ell번째 문자부터 rr번째 문자까지의 내용을 출력합니다. 모든 print 명령의 출력 길이 합은 10610^6을 넘지 않습니다.
  • copy ℓ\ell rr: 파일의 ℓ\ell번째 문자부터 rr번째 문자까지의 내용을 클립보드에 복사합니다.
  • cut ℓ\ell rr: 파일의 ℓ\ell번째 문자부터 rr번째 문자까지의 내용을 클립보드로 잘라냅니다.
  • paste pp: 클립보드의 내용을 파일의 pp번째 위치에 삽입합니다. 빈 클립보드를 붙여넣는 일은 없습니다.
  • serialize: 파일의 내용(클립보드 제외)을 출력합니다. 출력은 10710^7자를 넘을 수 없고, 3333 이상 126126 이하의 문자만 사용해야 합니다. 출력 문자열이 파일 내용과 정확히 같을 필요는 없지만, deserialize 명령에 대응해 파일을 복원할 수 있어야 합니다. 최소 한 글자는 출력해야 합니다. 이 명령은 첫 번째 실행의 마지막 명령으로 한 번만 주어집니다.
  • deserialize str\mathit{str}: str\mathit{str}은 serialize에 대해 출력된 문자열과 정확히 같습니다. 이 명령은 두 번째 실행의 첫 번째 명령으로 한 번만 주어집니다.
  • undo: 파일 내용을 바꾼 마지막 명령(insert, erase, cut, paste, deserialize)의 변경을 되돌립니다. 클립보드 상태는 그대로 둡니다. 이전 버전이 없으면 아무 일도 하지 않습니다.
  • redo: 아직 취소되지 않은 마지막 undo를 다시 실행합니다. 다음 버전이 없으면 아무 일도 하지 않습니다. 대부분의 텍스트 편집기와 마찬가지로, 파일 내용을 바꾸는 명령은 그 뒤의 모든 다음 버전을 지웁니다. copy 같은 다른 명령은 그렇지 않습니다.

입력

첫 줄에는 명령의 개수를 나타내는 정수 nn (1≤n≤1041 \leq n \leq 10^4)이 하나 주어집니다. 다음 nn개의 줄에 위에서 설명한 형식의 명령이 주어집니다. 두 실행의 입력 형식은 같습니다.

출력

print와 serialize 명령의 답을 각각 한 줄에 하나씩 출력합니다.

예제2

  1. 예제 1

    입력
    17
    insert 0 abcdef
    print 0 6
    erase 4 5
    print 0 5
    copy 0 3
    paste 1
    print 0 8
    cut 2 4
    print 0 6
    undo
    print 0 8
    paste 6
    print 0 10
    redo
    redo
    print 0 10
    serialize
    
    예상 출력
    abcdef
    abcdf
    aabcbcdf
    aabcdf
    aabcbcdf
    aabcbcbcdf
    aabcbcbcdf
    serialize:aabcbcbcdf
    
  2. 예제 2

    입력
    2
    deserialize serialize:aabcbcbcdf
    print 0 10
    
    예상 출력
    aabcbcbcdf