#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
using namespace std;
int PozycjaPytajnika(string Pesel)
{
for(int i = 0; i < Pesel.length(); i++)
{
if(Pesel[i] == '?')
return i;
}
}
int oblicz_pesel(string pesel, int pozycja_pytajnika)
{
pesel[pozycja_pytajnika] = pesel[pozycja_pytajnika] - '?' + '0';
int wynik = (pesel[0] - 48)*1 + (pesel[1] - 48)*3 +(pesel[2] - 48)*7 + (pesel[3] - 48)*9 + (pesel[4] - 48)*1 + (pesel[5] - 48)*3
+ (pesel[6] - 48)*7 + (pesel[7] - 48)*9 + (pesel[8] - 48)*1 + (pesel[9] - 48)*3 + (pesel[10] - 48)*1;
return wynik;
}
int WagaDoPozycji(int pozycja)
{
switch (pozycja)
{
case 0: return 1;
case 1: return 3;
case 2: return 7;
case 3: return 9;
case 4: return 1;
case 5: return 3;
case 6: return 7;
case 7: return 9;
case 8: return 1;
case 9: return 3;
case 10: return 1;
default:
break;
}
}
//tablica z liczba dni od początku roku (nieprzestepnego) dla kolejnych miesiecy
int liczbaDni[] =
{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
//1 jezeli podany rok jest przestepny,
//0 w przeciwnym wypadku
int przestepny(int rok)
{
return ((rok % 4 == 0 && rok % 100 != 0) || rok % 400 == 0);
}
//dla podanej daty wyznacza dzien tygodnia
//1 - poniedziałek, 2 - wtorek, ... 7 - niedziela
int dzienTygodnia(int dzien, int miesiac, int rok)
{
int dzienRoku;
int yy, c, g;
int wynik;
dzienRoku = dzien + liczbaDni[miesiac-1];
if ((miesiac > 2) && (przestepny(rok) == 1))
dzienRoku++;
yy = (rok - 1) % 100;
c = (rok - 1) - yy;
g = yy + (yy / 4);
wynik = (((((c / 100) % 4) * 5) + g) % 7);
wynik += dzienRoku - 1;
wynik %= 7;
return wynik+1;
}
int main()
{
ios::sync_with_stdio(0);
string kodKierownika, pesel;
int ile_peseli,wynik;
bool plec,dzienB,rokB;
plec = dzienB = rokB = true;
wynik = 0;
cin >> kodKierownika >> ile_peseli;
for(int i = 0; i < ile_peseli; i++)
{
cin >> pesel;
if( pesel[9] == '?' ||
pesel[0] == '?' ||
pesel[1] == '?' ||
pesel[2] == '?' ||
pesel[3] == '?' ||
pesel[4] == '?' ||
pesel[5] == '?' )
{
int pozycja = PozycjaPytajnika(pesel);
int suma_kontrolna = oblicz_pesel(pesel,pozycja);
for(int j = 0; j < 10; j++)
{
if((j*WagaDoPozycji(pozycja) + suma_kontrolna)%10 == (10 - (pesel[10] - '0')))
{
pesel[pozycja] = j + '0';
break;
}
}
}
int rok = (pesel[0] - '0') * 10 + (pesel[1] - '0') ;
int dzien = (pesel[4] - '0') * 10 + (pesel[5] - '0') ;
int miesiac = (pesel[2] - '0') * 10 + (pesel[3] - '0') ;
if(miesiac >= 1 && miesiac <= 12)
rok += 1900;
else if(miesiac >= 81 && miesiac <= 92)
{
rok += 1800; miesiac -= 80;
}
else if(miesiac >= 21 && miesiac <= 32)
{
rok += 2000; miesiac -= 20;
}
else if(miesiac >= 41 && miesiac <= 52)
{
rok += 2100; miesiac -= 40;
}
else if(miesiac >= 61 && miesiac <= 72)
{
rok += 2200; miesiac -= 60;
}
if(kodKierownika[0] != '0') // szukaj plec 1 - mezczyzna 2 kobieta
{
if(kodKierownika[0] == '1')
if( (pesel[9] - '0') % 2 == 0) plec = true;
else plec = false;
else
if( (pesel[9] - '0') % 2 == 1) plec = true;
else plec = false;
}
if(kodKierownika[1] != '0') // szukaj dzien tygodnia
{
if( dzienTygodnia(dzien,miesiac,rok) == (kodKierownika[1] - '0')) dzienB = true;
else dzienB = false;
}
if(kodKierownika[2] != '0') // szukaj przestepny 1 - przestepny 2 - zwykly
{
if( (przestepny(rok) + 1) == (kodKierownika[2] - '0')) rokB = true;
else rokB = false;
}
if( rokB == true && dzienB == true && plec == true)
wynik++;
}
cout << wynik << endl;
return 0;
}
//Zadanie w systemie SPOJ (latwe)
//
//9649. Lista numerów PESEL
//
//Kod zadania: PESELLST