세계 대회 본선에 진출한 사람이 바로 여러분이라고 상상해 보자. 멋진 일이다. 그러면 비행기, 기차, 버스 등 여러 교통수단으로 이동하게 될 것이다. 준비가 되었는가? 이 문제는 버스 시간표(time-table)를 읽는 방향 감각을 시험한다.
알다시피 모든 버스가 매일 운행하지는 않는다. 버스 시간표에서 버스가 운행하는 날은 보통 여러 지정자(specifier)의 목록으로 주어진다. 어떤 것은 단순하고("월요일만"), 어떤 것은 조금 헷갈리며("평일만"), 어떤 것은 완전히 난해하다.
이 문제에서 지정자는 다음 중 하나일 수 있다.
| 지정자 | 의미 |
|---|---|
1 | 버스는 월요일에 운행한다. |
2 … | 버스는 화요일에 운행한다. 이런 식으로 이어진다. |
7 | 버스는 일요일에 운행한다. |
t | 버스는 일요일과 공휴일에 운행한다. 공휴일은 1월 1일, 부활절 월요일, 5월 1일, 5월 8일, 7월 5일, 7월 6일, 9월 28일, 10월 28일, 11월 17일, 그리고 12월 24일·25일·26일이다. |
w | 버스는 평일에 운행한다. 평일은 월요일부터 금요일까지 중 t에 해당하는 날을 제외한 날이다. |
a | 버스는 t에 해당하는 날 바로 다음의 평일에 운행한다. |
또한 운행일은 특정 날짜 또는 날짜 범위로만 제한될 수 있으며, 이는 쉼표로 구분된 원소들의 목록으로 주어진다. 각 원소는 하나의 날짜(D.M. 형식, D는 일, M은 월) 또는 날짜 범위(D1.M1.-D2.M2. 형식, 앞의 날짜가 뒤의 날짜보다 앞서야 하며 두 경계 날짜 모두 범위에 포함된다)이다. 예를 들어 지정 문자열
3a 1.1.-30.6.,31.7.,1.9.-31.12.
는 수요일과 공휴일 바로 다음 평일에만 운행하되, 그 날이 7월 31일이거나 1월 1일부터 6월 30일 사이, 또는 9월 1일부터 12월 31일 사이(양 끝 포함)에 있을 때만 운행하는 버스를 나타낸다. 여러분의 과제는 주어진 연도에 이 버스가 운행하는 모든 날을 세는 것이다.
참고:
29.2.가 단일 날짜로 쓰이면 무시되고, 날짜 범위의 시작으로 쓰이면 3월 1일로 해석되며, 범위의 끝으로 쓰이면 2월 28일로 해석된다.
int golden, solar, lunar, p;
golden = (y % 19) + 1; solar = (y - 1600) / 100 - (y - 1600) / 400; lunar = (((y - 1400) / 100) * 8) / 25; p = (3003 - (11 * golden) + solar - lunar) % 30; if (p == 29 || (p == 28 && golden > 11)) p--;
교회 만월 날짜는 3월 21일로부터 $p$일 뒤이다(단 $0 \le p \le 28$).
입력은 여러 개의 테스트 케이스로 이루어지며, 각 케이스는 한 줄이다. 각 줄에는 비어 있지 않은 두 문자열 $S$, $R$과 정수 $Y$($1600 \le Y \le 3000$)가 공백으로 구분되어 주어진다. 문자열 $S$는 문자 1, …, 7, t, w, a만 포함하며, 각 문자는 최대 한 번 등장한다(순서는 임의이다). 문자열 $R$는 길이가 최대 1000이며, 위에서 설명한 형식의 날짜와 날짜 범위를 쉼표로 구분한 목록이다. $R$에 포함된 날짜와 날짜 범위는 서로 겹치지 않으며 항상 오름차순으로 주어진다. 입력은 파일 끝까지 읽는다.
각 입력 케이스에 대해, 연도 $Y$에서 범위 $R$에 속하면서 $S$의 지정자 중 적어도 하나를 만족하는 날의 개수를 정수 하나로 한 줄에 출력한다.