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

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

언어의 크기

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

요약
주어진 시작 문자열과 치환 규칙으로 만들어지는 서로 다른 문자열의 개수를 세고, 1000개를 넘으면 Too many.를 출력한다.
난이도

어려움10점 중 8점

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

문제

(형식) 언어(language)는 문자열의 집합이다. 특정 언어를 나타내는 한 가지 방법은 보통의 집합 표기법을 쓰는 것이지만, 집합이 큰 경우에는 문법(grammar)으로 표현하는 편이 더 편리할 수 있다.

여기서 다루는 문법은 두 부분으로 이루어진다.

  • 시작 문자열(initial string) 하나
  • s1 -> s2 꼴의 치환 규칙들의 집합 (여기서 s1, s2는 문자열이다)

이 문법이 정의하는 언어는, 시작 문자열에서 출발하여 현재 문자열 안에 나타나는 s1을 s2로 바꾸는 치환을 원하는 만큼 반복해 만들 수 있는 모든 문자열의 집합이다. 치환을 한 번도 적용하지 않은 결과, 즉 시작 문자열 자체도 언어에 포함된다.

예를 들어, 시작 문자열이

"AyB"

이고 치환 규칙이

{ "A" -> "ab", "Ay" -> "cdy", "B" -> "w", "B" -> "x" }

인 문법 G를 생각하자. 이 G가 생성하는 언어는 다음과 같다.

L = { "AyB", "Ayw", "Ayx", "abyB", "abyw", "abyx", "cdyB", "cdyw", "cdyx" }

문법 G가 주어질 때, 그 문법이 생성하는 언어에 서로 다른 문자열이 몇 개 들어 있는지 구하여라.

입력

첫째 줄에는 시작 문자열이 주어진다.

그 다음 줄부터는 치환 규칙이 한 줄에 하나씩 파일의 끝까지 주어진다. 치환 규칙은 최대 100개이다. 입력에 등장하는 각 문자열은 0개에서 10개 사이의 알파벳 대소문자로 이루어지며, 큰따옴표로 둘러싸여 있다. 입력에는 공백이 없다.

출력

문법 G가 생성하는 언어에 들어 있는 서로 다른 문자열의 개수를 정수 하나로 출력한다. 서로 다른 문자열이 1000개보다 많으면, 그 개수 대신 Too many.를 출력한다.

예제4

  1. 예제 1

    입력
    "AyB"
    "A"->"ab"
    "Ay"->"cdy"
    "B"->"w"
    "B"->"x"
    
    예상 출력
    9
    
  2. 예제 2

    입력
    "abc"
    
    예상 출력
    1
    
  3. 예제 3

    입력
    "AA"
    "A"->""
    
    예상 출력
    3
    
  4. 예제 4

    입력
    "X"
    "X"->"a"
    "X"->"b"
    
    예상 출력
    3