#include #include #include char buffer1[2000]; char buffer2[2000]; int InT[366]; int InW[366]; int InA[366]; int DayOfWeek[366]; int Allowed[366]; int InRange[366]; int nDays[2][12] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; int Paschal(int y) { int golden = (y % 19) + 1; int solar = (y - 1600) / 100 - (y - 1600) / 400; int lunar = (((y - 1400) / 100) * 8) / 25; int p = (3003 - (11 * golden) + solar - lunar) % 30; if(p == 29 || (p == 28 && golden > 11)) p--; return p; } int Leap(int y) { return ((!(y % 4)) && (y % 100)) || (!(y % 400)); } int ToIndex(int d, int m, int leap) { int rsl = 0; for(int i = 0; i < m - 1; i++) { rsl += nDays[leap][i]; } rsl += d - 1; return rsl; } int main() { int y; while(scanf("%s%s%d", buffer1, buffer2, &y) > 0) { memset(InT, 0, sizeof(InT)); memset(InW, 0, sizeof(InW)); memset(InA, 0, sizeof(InA)); memset(DayOfWeek, 0, sizeof(DayOfWeek)); memset(Allowed, 0, sizeof(Allowed)); memset(InRange, 0, sizeof(InRange)); int Ini = 4; for(int i = 2010; i < y; i++) { Ini += (1 + Leap(i)); Ini = (Ini + 14) % 7; } for(int i = 2009; i >= y; i--) { Ini -= (1 + Leap(i)); Ini = (Ini + 14) % 7; } DayOfWeek[0] = Ini; for(int i = 1; i < 366; i++) { DayOfWeek[i] = (DayOfWeek[i - 1] + 1) % 7; } int leap = Leap(y); int pfm = Paschal(y) + ToIndex(21, 3, leap); int em; for(int i = pfm + 1; 1; i++) { if(DayOfWeek[i] == 6) { em = i + 1; break; } } for(int i = 0; i < 365 + leap; i++) { if(DayOfWeek[i] == 6) { InT[i] = 1; } } InT[ToIndex(1, 1, leap)] = 1; InT[ToIndex(1, 5, leap)] = 1; InT[ToIndex(8, 5, leap)] = 1; InT[ToIndex(5, 7, leap)] = 1; InT[ToIndex(6, 7, leap)] = 1; InT[ToIndex(28, 9, leap)] = 1; InT[ToIndex(28, 10, leap)] = 1; InT[ToIndex(17, 11, leap)] = 1; InT[ToIndex(24, 12, leap)] = 1; InT[ToIndex(25, 12, leap)] = 1; InT[ToIndex(26, 12, leap)] = 1; InT[em] = 1; for(int i = 0; i < 365 + leap; i++) { if((DayOfWeek[i] < 5) && (!(InT[i]))) { InW[i] = 1; } } for(int i = 1; i < 365 + leap; i++) { if((InT[i - 1]) && (InW[i])) { InA[i] = 1; } } for(int i = 0; buffer1[i]; i++) { if((buffer1[i] >= '1') && (buffer1[i] <= '7')) { for(int j = 0; j < 365 + leap; j++) { if(DayOfWeek[j] == buffer1[i] - '1') { Allowed[j] = 1; } } } else if(buffer1[i] == 't') { for(int j = 0; j < 365 + leap; j++) { if(InT[j]) { Allowed[j] = 1; } } } else if(buffer1[i] == 'w') { for(int j = 0; j < 365 + leap; j++) { if(InW[j]) { Allowed[j] = 1; } } } else if(buffer1[i] == 'a') { for(int j = 0; j < 365 + leap; j++) { if(InA[j]) { Allowed[j] = 1; } } } } int d1, m1; int d2, m2; int r1, r2; for(int i = 0; buffer2[i]; i++) { d1 = 0; m1 = 0; d2 = 0; m2 = 0; while(buffer2[i] != '.') { d1 = (d1 * 10) + (buffer2[i] - '0'); i++; } i++; while(buffer2[i] != '.') { m1 = (m1 * 10) + (buffer2[i] - '0'); i++; } i++; if(buffer2[i] == ',') { if(!((!(leap)) && (d1 == 29) && (m1 == 2))) { InRange[ToIndex(d1, m1, leap)] = 1; } } else { i++; while(buffer2[i] != '.') { d2 = (d2 * 10) + (buffer2[i] - '0'); i++; } i++; while(buffer2[i] != '.') { m2 = (m2 * 10) + (buffer2[i] - '0'); i++; } i++; r1 = ToIndex(d1, m1, leap); r2 = ToIndex(d2, m2, leap); if((!(leap)) && (d2 == 29) && (m2 == 2)) { r2--; } for(int j = r1; j <= r2; j++) { InRange[j] = 1; } } } int n = 0; for(int i = 0; i < 365 + leap; i++) { if((Allowed[i]) && (InRange[i])) { n++; } } printf("%d\n", n); } return 0; }