#include #include #include using namespace std; int nd[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int paschal(int y) { 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--; return p; } inline bool isleap(int y) { if (y % 100 == 0) { if (y % 400 == 0) return true; } else { if (y % 4 == 0) return true; } return false; } inline int dow(int d, int m, int y) { int days = 0, i; for (i = 1600; i < y; i++) { if (isleap(i)) days++; days += 365; } for (i = 1; i < m; i++) { days += nd[i]; if (i == 2 && isleap(y)) days++; } days += d; days--; return (days % 7 + 5) % 7; } bool isholiday(int d, int m, int y) { if (m == 1 && d == 1) return true; if (m == 5 && d == 1) return true; if (m == 5 && d == 8) return true; if (m == 7 && d == 5) return true; if (m == 7 && d == 6) return true; if (m == 9 && d == 28) return true; if (m == 10 && d == 28) return true; if (m == 11 && d == 17) return true; if (m == 12 && d == 24) return true; if (m == 12 && d == 25) return true; if (m == 12 && d == 26) return true; int p = paschal(y); int mm = 3, dd = 21 + p + 1; if (dd > nd[mm]) { dd -= nd[mm]; mm++; } // najdeme nedelu while (dow(mm, dd, y) != 6) { dd++; if (dd > nd[mm]) { dd -= nd[mm]; mm++; } } // pondelok po nedeli dd++; if (dd > nd[mm]) { dd -= nd[mm]; mm++; } if (m == mm && d == dd) return true; return false; } char S[100], R[2000]; int y, i; bool ist, isw, isa; bool w[7]; bool leap; bool jazdi(int d, int m) { int down = dow(d, m, y); if (w[down]) return true; if (ist) { if (down == 6) return true; if (isholiday(d, m, y)) return true; } if (isa) { if (down >= 0 && down <= 4 && !isholiday(d,m,y)) { int dd = d-1, mm = m; if(dd == 0) { mm--; dd = nd[mm] + (mm == 2 && leap); } if (dow(dd,mm,y) == 6 || isholiday(dd,mm,y)) return true; } } if (isw) { if (down >= 0 && down <= 4 && !isholiday(d,m,y)) return true; } return false; } int main() { while (scanf("%s%s%d", S, R, &y) == 3) { ist = isw = isa = false; w[0] = w[1] = w[2] = w[3] = w[4] = w[5] = w[6] = false; for (i = 0; S[i] != '\0'; i++) { if (S[i] == '1') w[0] = true; if (S[i] == '2') w[1] = true; if (S[i] == '3') w[2] = true; if (S[i] == '4') w[3] = true; if (S[i] == '5') w[4] = true; if (S[i] == '6') w[5] = true; if (S[i] == '7') w[6] = true; if (S[i] == 'a') isa = true; if (S[i] == 't') ist = w[6] = true; if (S[i] == 'w') isw = true; } leap = isleap(y); int sd, sm, ed, em; int poc = 0; for (i = 0; i < (int)strlen(R); i++) { sscanf(R+i, "%d.%d.", &sd, &sm); char s[1000]; sprintf(s, "%d.%d.", sd, sm); i+=strlen(s); if (R[i] == '\0' || R[i] == ',') { // ignorovat if (sd == 29 && sm == 2 && !leap) continue; ed = sd, em = sm; } else { if (sd == 29 && sm == 2 && !leap) sd = 28; sscanf(R+i,"-%d.%d.", &ed, &em); sprintf(s, "-%d.%d.", ed, em); i+=strlen(s); if (ed == 29 && em == 2 && !leap) ed = 1,em=3; } //printf("%d.%d.-%d.%d.\n", sd, sm, ed, em); while(0) { poc += jazdi(sd, sm); if (sd == ed && sm == em) break; if (sm > em || (sm == em && sd > ed)) break; sd++; if (sd > nd[sm] + (sm==2 && leap)) { sd = 1; sm++; } } } printf("%d\n", poc); } return 0; }