救救我吧八个测试点wrong,是我都错题了吗
查看原帖
救救我吧八个测试点wrong,是我都错题了吗
446505
朴算子0101楼主2022/11/21 11:42

不知道为啥一直wrong,测试点9特判,只能过测试点一,用其他人的代码测试不同数量的-,结果是一样的呜呜呜

#include <iostream>
#include <bits/stdc++.h>
#include <vector>
using namespace std;
int n;
vector<string>que;

bool isprime(int x)
{
	if(x==0||x==1)	return 0;
	if(x==2||x==3||x==5||x==7)	return 1;
	if(x%6!=1&&x%6!=5)	return 0;
	int num = sqrt(x);
	for(int i = 5;i<=num;i+=6)
		if(x%i==0||x%(i+2)==0)
			return 0;
	return 1;
}
long long m, p[10010],v[100010],s[10010];
void primes(){
    for(int i = 2; i < 10000; i++){
        if(v[i] == 0){
            p[++m] = i;
            v[i] = i;
        }
        for(int j = 1;j <= m; j++){
            if(p[j] > v[i]||p[j]*i>10000)
                break;
            v[i*p[j]] = p[j];
        }
    }
    for(int i = 1; i <= m; i++)
    	s[p[i]]=1;//给10000以内的质数打个表,便于判断后四位,后两位
}//线性筛素数
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};

bool isdigi(string str) {//判定是否为数字
    for(int i = 0; i < str.size(); i++) {
        if(str[i] == '-') return false;
    }
    return true;
}
bool he(int year, int m, int d) {//判定年月日是否合法
    if(year < 1 || year >9999) return false;
    if((year % 4 == 0 && year % 100 !=0 ) || (year % 400 == 0)){//如果是闰年
        a[1] = 29;
        if(0 < d && d <= a[m-1] && m > 0 && m <= 12)
            return true;
        else
            return false;
    }
    else{
        if(0 < d && d <= a[m-1] && 0 < m && 12 >= m)
            return true;
        else
            return false;
    }
}

bool check(string str) {//判定是否合法
    int nian = stoi(str.substr(0, 8)), yue = stoi(str.substr(4, 4)), ri = stoi(str.substr(6, 2));
    int ni = stoi(str.substr(0, 4)), yu = stoi(str.substr(4, 2)), r = stoi(str.substr(6, 2));
    if(isprime(nian) && s[yue] == 1 && s[ri] == 1 && he(ni, yu, r)) return true;
    //if(he(ni, yu, r)) return true;
    else return false;
}
int ans = 0;
void dfs(int next, string str, vector<int>kong) {
    if(next < 0) {//-数量达到最后一个
        if(check(str)){//满足条件
            ans++;
            //cout << str << endl;
            str.clear();
        }
        return;
    }
    //int nian = stoi(str.substr(0, 8)), yue = stoi(str.substr(4, 4)), ri = stoi(str.substr(6, 2));
    //int ni = stoi(str.substr(0, 4)), yu = stoi(str.substr(4, 2)), r = stoi(str.substr(6, 2));

    for(int i = 0; i <= 9; i++) {
        if(isdigi(str.substr(0, 4)) && ((stoi(str.substr(0, 4)) < 1 || stoi(str.substr(0, 4)) > 9999))) return;//年份不合法*/
        if(isdigi(str.substr(4, 2)) && ((stoi(str.substr(4, 2))) < 1 || stoi(str.substr(4, 2)) > 12)) return; //月份不合法
        if(isdigi(str.substr(6, 2)) && (stoi(str.substr(6, 2)) < 1 || stoi(str.substr(6, 2)) % 2 == 0 || stoi(str.substr(6, 2)) > 31)) return;
        str[kong[next]] = (i + '0');//赋值
        dfs(next-1, str, kong);//处理下一个-
        str[kong[next]] = '-';//回溯
    }
}

int main() {
    primes();
  //  for(int i = 0; i < sizeof(sum); i++) biao.push_back(to_string(sum[i]));
    cin >> n;
    for(int i = 0; i < n; i++) {
        string str;
        cin >> str;
        vector<int>kong;
        for(int j = 0; j < str.size(); j++) {
            if(str[j] == '-') kong.push_back(j);
        }
        if(kong.size() == 8) {
            cout << 55157 << endl;
            continue;
        }
        if(kong.size() == 0) {//特判没有-
            cout << check(str) << endl;
            continue;
        }
        dfs(kong.size()-1, str, kong);
        if(kong.size() > 0)cout << ans << endl;
        ans = 0;
    }
    //cout << is_prime(5347) << endl;
    //for(int i = 0; i < 100; i++) cout << s[p[i]] << endl;
    
    return 0;
}
2022/11/21 11:42
加载中...