MiPoint @ 2021-08-28 12:04:38
4个WA......
看不出来哪里错了(没有TLE就很让人迷啊啊),求大佬帮忙看看啊
思路是枚举每一天找到所有回文日期
#include<bits/stdc++.h>
using namespace std;
int st,et;
int dates[100005],dateCnt;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool isr(int);
bool isrn(int);
void getYearEveryDay(int);
void getMonthEveryDay(int,int);
void getDaysInAMonth(int,int,int,int);
void getdates(int,int);
int getr(int,int);
bool isr(int t){//是否是回文
int l=0,dt[10]={0};
while(t){
dt[l++]=t%10;
t/=10;
}
for(int i = 0;i<l/2;i++)if(dt[i]!=dt[l-1-i])return false;
return true;
}
bool isrn(int t){//是否是闰年
if(t%4!=0)return false;
if(t%100==0&&t%400!=0)return false;
return true;
}
void getYearEveryDay(int yy){//获取一年里每一天
for(int i = 1;i<=12;i++)getMonthEveryDay(yy,i);
}
void getMonthEveryDay(int yy,int mm){//获取一个月里每一天
if(isrn(yy)&&mm==2){
for(int i = 1;i<=29;i++){
dateCnt++;
dates[dateCnt]=yy*10000+mm*100+i;
}
}
else{
for(int i = 1;i<=days[mm];i++){
dateCnt++;
dates[dateCnt]=yy*10000+mm*100+i;
}
}
}
void getDaysInAMonth(int yy,int mm,int stdd,int etdd){//获取月内的某一段时间
for(int i = stdd;i<=etdd;i++){
dateCnt++;
dates[dateCnt]=yy*10000+mm*100+i;
}
}
void getdates(int st,int et){
int dt[10]={0};
int l=0;
while(st){//分解开始时间日期
dt[l++]=st%10;
st/=10;
}
int styy=dt[7]*1000+dt[6]*100+dt[5]*10+dt[4];
int stmm=dt[3]*10+dt[2];
int stdd=dt[1]*10+dt[0];
l=0;
dt[10]={0};
while(st){//分解结束时间日期
dt[l++]=st%10;
st/=10;
}
int etyy=dt[7]*1000+dt[6]*100+dt[5]*10+dt[4];
int etmm=dt[3]*10+dt[2];
int etdd=dt[1]*10+dt[0];
//分解年份的日期
for(int i = styy+1;i<=etyy-1;i++){
getYearEveryDay(i);
}
//分解月份的日期
bool f=0;
if(styy==etyy)f=1;//在一年以内
if(f){
for(int i = stmm+1;i<=etmm-1;i++){
getMonthEveryDay(styy,i);
}
}
else{
for(int i = stmm+1;i<=12-1;i++){
getMonthEveryDay(styy,i);
}
for(int i = 1;i<=etmm-1;i++){
getMonthEveryDay(etyy,i);
}
}
//分解一个月以内的每一天
bool fg=0;
if(styy==etyy&&stmm==etmm)fg=1;//在一月以内
if(f){
getDaysInAMonth(styy,stmm,stdd,etdd);
}
else{
if(isrn(styy)&&stmm==2)getDaysInAMonth(styy,stmm,stdd,29);
else getDaysInAMonth(styy,stmm,stdd,days[stmm]);
getDaysInAMonth(etyy,etmm,1,etdd);
}
}
int getr(int st,int et){//获取指定范围内的每一天
int cnt=0;
getdates(st,et);
for(int i = 1;i<=dateCnt;i++){
if(isr(dates[i]))cnt++;
}
return cnt;
}
int main(){
cin>>st>>et;
cout<<getr(st,et);
return 0;
}