비밀번호

대소문자와 숫자를 모두 포함하면서 길이가 A 이상 B 이하이고, 숫자가 비슷한 글자를 대신할 수 있는 환경에서 금지어를 부분 문자열로 포함하지 않는 비밀번호의 개수를 센다.

어려움8동적 계획법문자열 매칭트라이조합론아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

새 비밀번호를 정해야 한다. 시스템 관리자가 정한 규칙은 다음과 같다.

  • 영문자와 숫자만 쓸 수 있다.
  • 길이는 AA자 이상 BB자 이하다.
  • 소문자, 대문자, 숫자를 각각 최소 한 개씩 포함해야 한다.
  • 금지 단어 목록(블랙리스트)에 있는 단어를 포함할 수 없다.

블랙리스트의 단어가 비밀번호 안에서 연속한 문자열로 나타나면 그 단어를 포함한 것으로 본다. 이때 대소문자는 구분하지 않는다. 예를 들어 swerc는 SwErC, 2016swerc2016, SWERC2016의 부분 문자열이지만 ICPC나 sw16erc의 부분 문자열은 아니다.

숫자를 글자 대신 쓴 표기도 걸러낸다. 0은 o, 1은 i, 3은 e, 5는 s, 7은 t로 읽는다. 그래서 5w3rC는 swerc가 나타난 것으로 보고, abcL337def는 leet를 포함한다. 숫자 2, 4, 6, 8, 9는 어떤 글자로도 읽지 않는다.

블랙리스트 단어 NN개와 두 정수 AA, BB가 주어진다. 규칙을 모두 지키는 서로 다른 비밀번호의 개수를 구하라. 개수가 매우 클 수 있으므로 1000003으로 나눈 나머지를 출력한다.

입력

첫째 줄에 비밀번호의 최소 길이 AA와 최대 길이 BB가 주어진다. 둘째 줄에 블랙리스트 단어의 개수 NN이 주어진다. 이어지는 NN개 줄에 블랙리스트 단어 WiW_i가 한 줄에 하나씩 주어진다. 각 단어는 영어 소문자로만 이루어진다.

출력

유효한 비밀번호의 개수를 1000003으로 나눈 나머지를 한 줄에 출력한다.

제한

  • 3AB203 \le A \le B \le 20
  • 0N500 \le N \le 50
  • 1Wi201 \le |W_i| \le 20