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

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

지루한 수업

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

요약
문자열 s를 t로 바꾸는 최소 편집 거리를 구하고, 그 최단 경로 위에 함께 나타날 수 있는 좋아하는 문자열 w_i의 최대 개수를 찾아 순서대로 출력한다.
난이도

어려움10점 중 9점

유형
동적 계획법, 문자열, 그래프, 최단 경로
정답자
아직 제출이 없습니다

문제

Ildar는 지루한 온라인 수업을 듣고 있다. 심심함을 달래려고 그는 문자열을 변형한다. 처음에 그는 문자열 ss를 가지고 있다. Ildar는 문자열 ss에서 문자열 tt를 최소 횟수의 단계로 얻고 싶어 한다. 한 단계에서 그는 다음을 할 수 있다:

  • 임의의 위치에서 문자를 제거한다.
  • 임의의 위치에 임의의 문자를 삽입한다. 즉 첫 번째 문자 앞, 인접한 두 문자 사이, 또는 마지막 문자 뒤에 삽입한다.
  • 임의의 위치에 있는 문자를 다른 임의의 문자로 바꾼다.

문자열 ss를 문자열 tt로 변환하는 데 필요한 이러한 단계의 최소 횟수는 ss와 tt 사이의 편집 거리라고도 한다.

Ildar에게는 nn개의 좋아하는 문자열 wiw_i가 있다. 변환이 진행되는 동안 나타나는 문자열의 나열 s=x1s = x_1, x2x_2, \dots, xm−1x_{m - 1}, xm=tx_m = t를 생각하자. Ildar는 wiw_i 중 가능한 한 많은 문자열이 집합 {x1,x2,…,xm}\{x_1, x_2, \dots, x_m\}에 나타나기를 원한다. Ildar가 ss를 tt로 변환하는 데 필요한 최소 단계 수와, 이 과정에서 나타날 수 있는 wiw_i의 최대 개수를 구하고, 해당 문자열들도 출력하도록 도와라.

입력

입력의 첫 번째 줄에는 문자열 ss가 주어진다.

입력의 두 번째 줄에는 문자열 tt가 주어진다.

세 번째 줄에는 정수 nn이 하나 주어진다 (0≤n≤1 0000 \le n \le 1\,000). 다음 nn개의 줄에는 문자열 wiw_i가 주어진다.

모든 문자열은 소문자 영어 알파벳으로 이루어져 있고, 비어 있지 않으며, 길이는 10 00010\,000을 넘지 않는다. 모든 문자열의 길이의 합은 10 00010\,000을 넘지 않는다. 모든 문자열은 서로 다르며, s≠ts \neq t, s≠wis \neq w_i, t≠wit \neq w_i이다.

출력

출력의 첫 번째 줄에는 ss를 tt로 변환하는 데 필요한 최소 단계 수와, 변환 과정에서 나타날 수 있는 문자열 wiw_i의 최대 개수를 출력한다.

그다음에는 변환 과정에서 나타날 수 있는 문자열 wiw_i를, 나타나는 순서대로 출력한다. 정답이 여러 개라면 그중 아무거나 출력해도 된다.

힌트

두 번째 예시에서 올바른 변환 중 하나는 다음과 같다:

"longlong" →\rightarrow "longleng" →\rightarrow "dongleng" →\rightarrow "dongleg" →\rightarrow "dongle" →\rightarrow "donble" →\rightarrow "double"

Ildar가 좋아하는 문자열은 굵게 표시했다.

예제2

  1. 예제 1

    입력
    cat
    dog
    4
    dot
    pot
    rat
    oat
    
    예상 출력
    3 1
    dot
    
  2. 예제 2

    입력
    longlong
    double
    3
    doublon
    longleng
    dongle
    
    예상 출력
    6 2
    longleng
    dongle