A. 公元 2020 年
每次测试的时间限制1秒
每个测试的内存限制256 MB
2020 年是当年,是闰年,从公历的星期三开始,即公元 2020 年 (CE) 和纪元年 (AD),第三个千年的第 20 年,21 世纪的第 20 年世纪,以及 2020 年代十年的第一年。
2020年被世界卫生组织指定为护士和助产士年。联合国已宣布 2020 年为国际植物健康年。 2020 年被国际声学委员会指定为国际声音年。
因为2020年发生了太多令人难忘的事情,所以现在有人提议将所有子字符串包含“202”的日期指定为减灾日。我们以 YYYYMMDD 的格式表示一个日期(例如 21110202),那么如果 202 是这个日期的子串,那么这一天就是减灾日。
请编写一个程序计算 Y1M1D1 和 Y2M2D2 之间的所有日期(包括两个日期)中的减灾天数?请注意,您应该考虑闰年。闰年是可以被 400 整除或可以被 4 整除但不能被 100 整除的年份。闰年的二月有 29 天,而不是正常的 28 天。
输入
输入包含多个案例。输入的第一行包含一个正整数 T (1≤T≤105),即事例数。每个案例的第一行也是唯一一行包含六个整数 Y1,M1,D1,Y2,M2,D2,它们在上面的问题陈述中进行了描述。
保证 Y1M1D1 不大于 Y2M2D2。 Y1M1D1 和 Y2M2D2 都在 20000101 和 99991231 之间,两个日期都有效。
温馨提示,这个问题的输入和输出量可能很大,所以建议使用更快的 I/O 方法。例如,在 C++ 中,您可以使用 scanf/printf 代替 cin/cout。
输出
对于每种情况,打印一行包含一个整数,即答案。
例子
输入
3
2111 02 01 2111 02 03
2202 01 01 2202 12 31
2000 01 01 9999 12 31
输出
1
365
44294
样例解释
在第一个示例中,21110202 是唯一的减灾日。在第二个示例中,202 是 2202 的子字符串,因此 2202 年的每一天都是减灾日!
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int f[N];
int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(int y) //判断闰年
{
if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) return true;
return false;
}
int main()
{
//二分下标为个数,存储含有202的日期
//预处理
int cnt = 0;
for(int y = 2000; y<=9999; y++)
{
if(check(y)) mon[2] = 29;
else mon[2] = 28;
for(int m=1; m<=12; m++)
{
for(int d=1; d<=mon[m]; d++)
{
int s1 = y*10000 + m*100 + d;
string s = to_string(s1);
if(s.find("202") != -1)
f[++cnt] = s1;
}
}
}
int T;
cin >> T;
while(T --)
{
int y1, m1, d1, y2, m2, d2;
cin >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
int start = y1*10000 + m1*100 + d1;
int end = y2*10000 + m2*100 + d2;
int l = lower_bound(f+1, f+1+cnt, start) - f;
int r = upper_bound(f+1, f+1+cnt, end) - f;
cout << r - l << endl;
}
return 0;
}