#include #include #include #include using namespace std; #define DG if(0) char S[50], R[2000]; int WF[5000]; int Y, YL, PRR; int A[400], B[400], IST[400], ISW[400], ISA[400]; int getprr(int y) { if(y%400 == 0) return 1; if(y%100 == 0) return 0; if(y%4 == 0) return 1; return 0; } int getyl(int y) { return 365 + getprr(y); } int wd(int d) { return (WF[Y]+d)%7 + '1'; } int geteaster() { int golden, solar, lunar, p; int y = Y; 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--; int pfm = (79 + PRR) + p; DG printf("PRR=%d, p=%d, pfm=%d, wd(pfm)=%c\n", PRR, p, pfm, wd(pfm)); DG printf("wd(0)=%c\n", wd(0)); int d = pfm + 1; while(wd(d) != '7') d++; DG printf("easter is %d\n", d+1); return d+1; } int parse(int b, int e, int op) { int d, m; int i; sscanf(R+b, "%d.%d", &d, &m); if(d == 29 && m == 2 && !PRR) { if(op == 0) return -1; if(op == 1) d=1, m=3; if(op == 2) d=28; } int rr = 0; int z[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if(YL == 366) z[1] = 29; for(i = 1; i < m; i++) rr += z[i-1]; rr += d-1; DG printf("parse(%d.%d.) == %d\n", d, m, rr); return rr; } void spracuj(int b, int e) { int m = -1; int i; for(i = b; i < e; i++) if(R[i] == '-') m = i; if(m == -1) { int z = parse(b, e, 0); if(z != -1) B[z] = 1; } else { int ff = parse(b, m, 1), tt = parse(m+1, e, 2); for(i = ff; i <= tt; i++) B[i] = 1; } } int main() { int i, d, j, k; WF[1600] = 5; for(i = 1600; i < 3000; i++) WF[i+1] = (WF[i] + getyl(i)) % 7; while(scanf("%s%s%d", S, R, &Y) == 3) { PRR = getprr(Y); YL = getyl(Y); for(d = 0; d < YL+8; d++) A[d] = B[d] = IST[d] = ISW[d] = ISA[d] = 0; for(d = 0; d < YL; d++) if(wd(d) == '7') IST[d] = 1; IST[0] = 1; IST[120+PRR] = 1; IST[127+PRR] = 1; IST[185+PRR] = 1; IST[186+PRR] = 1; IST[270+PRR] = 1; IST[300+PRR] = 1; IST[320+PRR] = 1; IST[357+PRR] = 1; IST[358+PRR] = 1; IST[359+PRR] = 1; IST[geteaster()] = 1; for(d = 0; d < YL; d++) ISW[d] = (wd(d) <= '5' && !IST[d]); for(k = 0; S[k]; k++) switch(S[k]) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': for(d = 0; d < YL; d++) if(wd(d) == S[k]) A[d] = 1; break; case 't': for(d = 0; d < YL; d++) if(IST[d]) A[d] = 1; break; case 'w': for(d = 0; d < YL; d++) if(ISW[d]) A[d] = 1; break; case 'a': for(d = 1; d < YL; d++) if(ISW[d] && IST[d-1]) A[d] = 1; break; } for(i = 0; R[i]; i++) { for(j = i; R[j] && R[j] != ','; j++) ; spracuj(i, j); i = j; if(!R[j]) break; } int rr = 0; for(d = 0; d < YL; d++) if(A[d] && B[d]) rr++; printf("%d\n", rr); } return 0; }