----------------------思路----------------
两边对称,故确定一边即可确定另一边,也就是说给定年份,如果能回文,那么回文的日期部分就确定了,如果给定月日,回文的年也能确定
我一开始考虑的是,找下一年比较简单,所以用年份确定日期,然后判断是否为回文
但是这样会有个问题,输入不是回文的时候,比如20200201,年份++的话,直接跳过20200202了,这显然不对
这种情况,直接把年份和年份的回文拼接也不妥,比如20200203,直接拼接是20200202,这一天前面,题目要求的是之后的
所以考虑对不是回文的日期进行处理,判断这一年里这一天之后有无回文,最多366次也不复杂
如果这一年里没有回文日期,那么就年份++判断回文就好啦,和输入是回文日期的情况同样的处理方法
#include <bits/stdc++.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <cstring>
#include <stdio.h>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <string>
#define MAX 110
#define INF 0x3f3f3f3f
#define EXP 1e-9
#define DEUBG 0
#define MOD 1000000007
using namespace std;
typedef long long ll;
int n,m,t,k;
int year,dd,mm;
int tbm[2][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
0,31,29,31,30,31,30,31,31,30,31,30,31};
int isrun(int year){
if(year%100==0&&year%400==0)return 1;
else if(year%100&&year%4==0)return 1;
return 0;
}
int tonum(string s){ //string转int
int r=0;
for(int i=0;i<s.length();i++){
r=r*10+s[i]-'0';
}
return r;
}
string tostring(int year){ //int 转string
string r="";
while(year){
r=(char)(year%10+'0')+r;
year/=10;
}
return r;
}
int checkyear(int year){ //判断这一年对应日期是不是回文
int p=isrun(year);
string ys=tostring(year);
// cout<<"ys:"<<ys<<endl;
reverse(ys.begin(),ys.end());
int mm=tonum(ys.substr(0,2));
int dd=tonum(ys.substr(2,2));
// printf("%d %d %d;\n",year,mm,dd);
if(mm<=12&&dd<=tbm[p][mm])return 1;
else return 0;
}
int checkAB(int year){ //判断这一年所形成的日期 是不是ABAB型回文
string ys=tostring(year);
reverse(ys.begin(),ys.end());
int mm=tonum(ys.substr(0,2));
int dd=tonum(ys.substr(2,2));
if(mm==dd&&mm<=12&&dd<=tbm[p][mm])return 1;
else return 0;
}
int check(int year,int mm,int dd){ //判断所给年份是不是回文
string ys=tostring(year);
reverse(ys.begin(),ys.end());
int mt=tonum(ys.substr(0,2));
int dt=tonum(ys.substr(2,2));
if(mm==mt&&dd==dt)return 1;
else return 0;
}
void nxtday(int p,int &mm,int &dd){ //找这一年里的下一天
if(dd<tbm[p][mm]){
dd++;
}
else{
dd=0;
mm++;
}
}
int main(){
string s;
cin>>s;
year=tonum(s.substr(0,4));
// cout<<"year:"<<year<<endl;
int p=isrun(year);
dd=tonum(s.substr(6,2));
mm=tonum(s.substr(4,2));
if(check(year,mm,dd))year++;//输入即回文日期,跳过这个
else { //输入不是回文日期,先判断这一年后面的日子里有没有回文日期
nxtday(p,mm,dd);
while(m<=12&&!check(year,mm,dd)){
nxtday(p,mm,dd);
}
}
while(!checkyear(year)){
year++;
}
string t=tostring(year);
cout<<t;
reverse(t.begin(),t.end());
cout<<t<<endl;
while(!checkAB(year)||!checkyear(year)){
year++;
}
t=tostring(year);
cout<<t;
reverse(t.begin(),t.end());
cout<<t<<endl;
return 0;
}