| 时间限制 | 内存限制 | 
|---|---|
1000 ms | 
65536 KB | 
# 题目描述
作为北航的一名学生,Moca 经常要进行网站开发。
在网站开发中,不可避免的一个工作就是检验用户注册时,输入的昵称是否合法。为了提升用户昵称的独特性,Moca 设计了一种特殊的昵称格式:他希望用户昵称的前半部分由一个回文串组成(即该部分字符串从前往后和从后往前读是完全相同的,空串也算回文串);后半部分应该由 八位数字 组成,应当是一个合法的日期,用来表示用户的生日。仅需考虑最简单的闰年规则,即 1582 年后的惯例 “四年一闰,百年不闰,四百年再闰”。
为了实现这一目标,Moca 需要编写一个昵称检验程序,以便在用户注册时即时验证昵称的合法性。你能帮 Moca 完成这个任务吗?
# 输入格式
第一行输入一个正整数 ,表示要检验的用户名数()。
接下来 行,每行一个字符串 , 的长度在 到 之间(即不保证 的长度一定大于等于 ); 仅有大小写字母和数字组成。当 的长度大于等于 时,并不保证 的后八个字符都是数字。
# 输出格式
对每行输入,如果合法对应输出  Yes ,如果不合法对应输出  No 。
# 输入样例
5  | |
MocacoM20240901  | |
MitakeMoca  | |
Moca  | |
20240901  | |
MocacoM20230229  | 
# 输出样例
Yes  | |
No  | |
No  | |
Yes  | |
No  | 
# 题解:模拟
直接按照题意模拟即可。
时间复杂度:,其中 为所有字符串长度之和。
参考代码:
#include <stdio.h> | |
#include <stdbool.h> | |
#include <string.h> | |
#include <ctype.h> | |
const int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  | |
int n;  | |
char name[1010];  | |
bool CheckPalindrome(int l, int r)  | |
{ | |
if (l > r)  | |
return true;  | |
int len = r - l + 1;  | |
for (int i = l; i <= l + (len >> 1); ++ i)  | |
if (name[i] != name[l + r - i])  | |
return false;  | |
return true;  | |
} | |
int StringToInt(int l, int r)  | |
{ | |
int val = 0;  | |
for (int i = l; i <= r; ++ i)  | |
val = val * 10 + name[i] - '0';  | |
return val;  | |
} | |
bool IsRun(int year)  | |
{ | |
return (year % 400 == 0) || (year % 100 != 0 && year % 4 == 0);  | |
} | |
bool CheckDate(int l, int r)  | |
{ | |
for (int i = l; i <= r; ++ i)  | |
if (!isdigit(name[i]))  | |
return false;  | |
int year = StringToInt(l, l + 3);  | |
int month = StringToInt(l + 4, l + 5);  | |
int day = StringToInt(l + 6, l + 7);  | |
if (month < 1 || month > 12)  | |
return false;  | |
if (day < 1 || day > 31)  | |
return false;  | |
return (IsRun(year) && month == 2 && day == 29) || day <= days[month];  | |
} | |
bool Check()  | |
{ | |
int len = strlen(name);  | |
if (len < 8)  | |
return false;  | |
return CheckPalindrome(0, len - 9) && CheckDate(len - 8, len - 1);  | |
} | |
int main()  | |
{ | |
    // freopen("Q.in", "r", stdin); | |
    // freopen("Q.out", "w", stdout); | |
scanf("%d", &n);  | |
getchar();  | |
for (int i = 1; i <= n; ++ i)  | |
    { | |
scanf("%s", name);  | |
puts(Check() ? "Yes" : "No");  | |
    } | |
return 0;  | |
} |