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

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

sed 사용하기

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

요약
주어진 최대 10개의 치환 규칙으로 sed처럼 왼쪽부터 겹치지 않게 치환하는 연산을 반복해 문자열을 목표 문자열로 바꾸는 최소 연산 횟수를 구합니다.
난이도

어려움10점 중 8점

유형
BFS, 문자열 매칭, 시뮬레이션
정답자
아직 제출이 없습니다

문제

sed는 입력으로 주어진 문자열에서 문자열 α\alpha를 다른 문자열 β\beta로 바꾸는 데 사용되는 리눅스 유틸리티이다. 여기서 입력으로 주어지는 문자열은 파일의 한 줄이다. sed는 다음 두 단계를 수행한다.

  1. 입력 문자열에서 서로 겹치지 않는 α\alpha의 등장을 표시한다. (원래 문자열에서 α\alpha끼리 겹칠 수는 있지만, 표시하는 것들은 서로 겹치면 안 된다.) 서로 겹치지 않게 고르는 방법이 여러 가지이면 가장 왼쪽에 있는 것들을 고른다.
  2. 표시한 모든 α\alpha를 동시에 β\beta로 바꾼다. 나머지 문자는 그대로 둔다.

예를 들어 α\alpha가 aa, β\beta가 bca, 입력 문자열이 aaxaaa이면 sed를 실행한 결과는 bcaxbcaa이다. (aaxbcaa나 bcaxabca는 될 수 없다.) 이 결과 bcaxbcaa에 sed를 다시 실행하면 bcaxbcbca가 된다.

문자열을 바꾸는 규칙 nn개 (αi,βi)(\alpha_i, \beta_i) (i=1,2,…,ni = 1, 2, \ldots, n), 초기 문자열 γ\gamma, 최종 문자열 δ\delta가 주어진다. sed를 이용해 γ\gamma를 δ\delta로 바꿀 때 필요한 문자열 바꾸기 연산 횟수의 최솟값을 구하려고 한다.

하나의 규칙 (αi,βi)(\alpha_i, \beta_i)는 위에서 설명한 대로 현재 문자열에서 서로 겹치지 않는(가장 왼쪽) αi\alpha_i의 모든 등장을 동시에 βi\beta_i로 바꾸는 것을 뜻하며, 이것이 한 번의 연산이다. 각 규칙은 여러 번 사용해도 되고 사용하지 않아도 된다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 형식은 다음과 같다.

n
α1 β1
α2 β2
...
αn βn
γ
δ

nn은 문자열 바꾸기 규칙의 개수이다. αi\alpha_i와 βi\beta_i는 공백으로 구분되며 1≤∣αi∣<∣βi∣≤101 \le |\alpha_i| < |\beta_i| \le 10을 만족한다. (∣s∣|s|는 문자열 ss의 길이) 모든 i≠ji \ne j에 대해 αi≠αj\alpha_i \ne \alpha_j이고, n≤10n \le 10, 1≤∣γ∣<∣δ∣≤101 \le |\gamma| < |\delta| \le 10이다. 모든 문자열은 알파벳 소문자로만 이루어져 있으며, 입력의 마지막 줄에는 00이 하나 주어진다.

출력

각 테스트 케이스에 대해 γ\gamma를 δ\delta로 바꾸는 데 필요한 문자열 바꾸기 연산 횟수의 최솟값을 출력한다. 만약 γ\gamma를 δ\delta로 바꿀 수 없다면 −1-1을 출력한다.

예제3

  1. 예제 1

    입력
    2
    a bb
    b aa
    a
    bbbbbbbb
    1
    a aa
    a
    aaaaa
    3
    ab aab
    abc aadc
    ad dee
    abc
    deeeeeeeec
    10
    a abc
    b bai
    c acf
    d bed
    e abh
    f fag
    g abe
    h bag
    i aaj
    j bbb
    a
    abacfaabe
    0
    
    예상 출력
    3
    -1
    7
    4
    
  2. 예제 2

    입력
    1
    a aaa
    a
    aaa
    0
    
    예상 출력
    1
    
  3. 예제 3

    입력
    1
    a aa
    a
    aaa
    0
    
    예상 출력
    -1