时间限制 | 内存限制 |
---|---|
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; | |
} |