만드는 중입니다

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

문자열 테이블

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

요약
이웃한 칸의 문자열을 사전순으로 비교해 이어 붙이는 표를 만들고, 마지막 칸 문자열의 지정된 위치부터 50자를 출력한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 문자열, 재귀, 분할 정복
정답자
아직 제출이 없습니다

문제

두 문자열 ss와 tt가 주어진다. 두 문자열에 쓰인 문자는 모두 서로 다르다. 즉, 같은 문자가 두 번 이상 나오지 않으며, ss에 나오는 문자는 tt에 나오지 않고 tt에 나오는 문자도 ss에 나오지 않는다.

ss의 길이를 NN, tt의 길이를 MM이라 하자. 2차원 배열 table은 다음과 같이 정의한다.

  • table[i][0] = s[i-1] (1≤i≤N1 \le i \le N)
  • table[0][j] = t[j-1] (1≤j≤M1 \le j \le M)
  • table[i][j] = min(table[i-1][j], table[i][j-1]) + max(table[i-1][j], table[i][j-1]) (1≤i≤N1 \le i \le N, 1≤j≤M1 \le j \le M)

min은 두 문자열 중 사전 순으로 앞서는 문자열을, max는 사전 순으로 뒤에 오는 문자열을 돌려주는 함수이다. 문자는 ASCII 코드 순서로 비교하므로 숫자가 대문자보다, 대문자가 소문자보다 앞선다. A+B는 문자열 A 뒤에 문자열 B를 이어 붙이는 연산이다.

table[N][M]의 부분 문자열을 구하는 프로그램을 작성하시오. 부분 문자열이 매우 길어질 수 있으므로 pos번째 문자부터 min⁡(50,L−pos)\min(50, L - pos)개의 문자만 출력한다. 여기서 LL은 table[N][M]의 길이이고, 문자의 위치는 0부터 센다.

입력

첫째 줄에 ss, 둘째 줄에 tt, 셋째 줄에 pospos가 주어진다. (0≤pos<L0 \le pos < L)

ss와 tt의 길이는 각각 1 이상 30 이하이며, 알파벳 대문자, 소문자, 숫자로만 이루어져 있다.

출력

첫째 줄에 table[N][M]의 pospos번째 문자부터 min⁡(50,L−pos)\min(50, L - pos)개의 문자로 이루어진 부분 문자열을 출력한다.

예제5

  1. 예제 1

    입력
    ad
    cb
    0
    
    예상 출력
    acbacd
    
  2. 예제 2

    입력
    fox
    cat
    0
    
    예상 출력
    acfcfoacftacfcfocfox
    
  3. 예제 3

    입력
    Ra6b1t
    W0lf
    66
    
    예상 출력
    RWab0RWRWa0RWl0RWRWa6RWa0RWRWa6RWa6RWab0RWRWa6RWa6
    
  4. 예제 4

    입력
    M0HAXG
    COFU12
    919
    
    예상 출력
    MOFU2
    
  5. 예제 5

    입력
    a0B1c2D3e4F5gHiJkLmN
    A9b8C7d6EfGhIjKlMn
    9876543210
    
    예상 출력
    B10AaB1c0Aa9Aa0AaB0AaB10AaB1c0AaB1c20Aa9Aa0AaB0Aa9