#include #define MAX 2000 int maska[12][31]; int dnu[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int pdnu[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; char prefix[256]; int prvni[4000]; int delka[2] = { 365, 366 }; int svd[] = { 0, 0, 7, 4, 5, 27, 27, 16, 23, 24, 25}; int svm[] = { 0, 4, 4, 6, 6, 8, 9, 10, 11, 11, 11}; int posvd[] = { 1, 1, 8, 6, 28, 28, 17, 26}; int posvm[] = { 0, 4, 4, 6, 8, 9, 10, 11}; int akty[12][31]; int prestupny(int rok) { if (rok % 4 != 0) return 0; else if (rok % 100 == 0 && rok % 400 != 0) return 0; return 1; } int pondelok(int d, int m, int rok, int akt) { if (m < 2 || m > 4) return 0; int golden, solar, lunar, p; golden = (rok % 19) + 1; solar = (rok - 1600) / 100 - (rok - 1600) / 400; lunar = (((rok - 1400) / 100) * 8) / 25; p = (3003 - (11 * golden) + solar - lunar) % 30; if (p == 29 || (p == 28 && golden > 11)) p--; p += 20; int mn = 2; if (p >= 31) { p %= 31; mn = 3; } do { p++; if (p >= pdnu[mn]) { mn++; p = 0; } } while (akty[mn][p] != 6); p++; if (p >= pdnu[mn]) { mn++; p = 0; } return (m == mn && d == p); } int volny_den(int d, int m, int rok, int akt) { if (akt == 6) return 1; for (int i = 0; i <= 10; i++) if (svm[i] == m && svd[i] == d) return 1; if (pondelok(d,m,rok,akt)) return 1; return 0; } int prac_den(int d, int m, int rok, int akt) { return akt < 5 && !volny_den(d,m,rok,akt); } int po_vol(int d, int m, int rok, int akt) { if (!prac_den(d,m,rok,akt)) return 0; d--; if (d < 0) { m--; if (m < 0) { rok--; m = 11; } d = pdnu[m]-1; } return volny_den(d,m,rok,((akt-1)+70)%7); } int main() { prvni[2000] = 5; for (int i = 1999; i >= 0; i--) prvni[i] = (prvni[i+1] - delka[prestupny(i)] + 700) % 7; for (int i = 2001; i < 4000; i++) prvni[i] = (prvni[i-1] + delka[prestupny(i-1)]) % 7; while (1) { for (int i = 0; i < 12; i++) { for (int j = 0; j < 31; j++) maska[i][j] = 0; } for (int i = 0; i < 256; i++) prefix[i] = 0; while (1) { char ch; ch = getchar(); if (ch == EOF) return 0; if (ch == ' ') break; prefix[ch] = 1; } int d, m, d2, m2; while (1) { scanf("%d.%d.", &d, &m); char ch; ch = getchar(); if (ch == '-') { scanf("%d.%d.", &d2, &m2); ch = getchar(); if (m == m2) { for (int i = d-1; i < d2; i++) maska[m-1][i] = 1; } else { for (int i = d-1; i < 31; i++) maska[m-1][i] = 1; for (int i = m; i < m2-1; i++) for (int j = 0; j < 31; j++) maska[i][j] = 1; for (int i = 0; i < d2; i++) maska[m2-1][i] = 1; } } else { maska[m-1][d-1] = 1; } if (ch == ' ') break; } int rok; scanf("%d\n", &rok); for (int i = 0; i < 12; i++) { for (int j = dnu[i]; j < 31; j++) maska[i][j] = 0; } if (prestupny(rok) == 0) maska[1][28] = 0; if (prestupny(rok)) pdnu[1] = 29; else pdnu[1] = 28; int akt = prvni[rok]; for (int i = 0; i < 12; i++) { for (int j = 0; j < pdnu[i]; j++) { akty[i][j] = akt; akt++; akt %= 7; } } akt = prvni[rok]; for (int i = 0; i < 12; i++) { for (int j = 0; j < pdnu[i]; j++) { if (maska[i][j] != 0) { if (prefix[akt+'1']) maska[i][j] = 2; if (prefix['w'] && prac_den(j, i, rok, akt)) maska[i][j] = 2; if (prefix['t'] && volny_den(j, i, rok, akt)) maska[i][j] = 2; if (prefix['a'] && po_vol(j,i,rok,akt)) maska[i][j] = 2; } akt++; akt %= 7; } } /*printf("prvni: %d\n", prvni[rok]); akt = prvni[rok]; for (int i = 0; i < akt; i++) printf("\t"); for (int i = 0; i < 12; i++) { for (int j = 0; j < pdnu[i]; j++) { if (akt % 7 == 0) printf("\n"); printf("(%d.%d)=%d,", i+1, j+1, maska[i][j]); akt++; } }*/ int poc = 0; for (int i = 0; i < 12; i++) { for (int j = 0; j < 31; j++) { if (maska[i][j] == 2) poc++; } } printf("%d\n", poc); } return 0; }