伪代码
先把所有符合条件的年月日找出
while (询问次数){
    输入询问串
    for 遍历每一个找出的年月日
        flag=1
        for 遍历年月日的每一位
            if (该位是否可以与询问串的相应位兼容) 不兼容flag=0
        ans+=flag
    输出ans
}
码子:
#include <iostream>
using namespace std;

const int N=1000000;

int day[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
string s;
int dprm[30],dcnt,dmprm[300],dmcnt;
int prime[N],cnt,flag;
bool st[50];

bool isprime(int x){
	for(int i=2;i<=x/i;i++){
		if(x%i==0) return false ;
	}
	return true;
}
void mTable(){
	for(int i=2;i<=41;i++){
		if(!st[i]) dprm[dcnt++]=i;
		for(int j=0;dprm[j]<=31/i;j++){
			st[dprm[j]*i]=true;
			if(i%dprm[j]==0) break;
		}
	}
	
	for(int i=1;i<=12;i++){
		for(int j=0;dprm[j]<=day[i];j++){
			if(isprime(dprm[j]+i*100)) dmprm[dmcnt++]=dprm[j]+i*100;
		}
	}
	for(int i=4;i<=9999;i+=4){
		if((i%100||i%400==0)&&isprime(i*10000+229)) prime[cnt++]=i*10000+229;
	}
	for(int i=1;i<=9999;i++){
		for(int j=0;j<dmcnt;j++){
			if(isprime(i*10000+dmprm[j])) prime[cnt++]=i*10000+dmprm[j];
		}
	}
}
int n,ans;
int main(int argc, char** argv) {
	cin>>n;
	mTable();
	
	while(n--){
		ans=0;
		cin>>s;
		for(int i=0;i<cnt;i++){
			int num=prime[i];
			flag=1;
			for(int j=7;flag&&j>=0;j--){
				if(s[j]!='-'&&s[j]-'0'!=num%10) flag=0;
				num/=10;
			}
			ans+=flag;
		}
		cout<<ans<<endl;
	}
	return 0;
}