时间限制 内存限制
1000 ms 65536 KB

# 题目描述

作为北航的一名学生,Moca 经常要进行网站开发。

在网站开发中,不可避免的一个工作就是检验用户注册时,输入的昵称是否合法。为了提升用户昵称的独特性,Moca 设计了一种特殊的昵称格式:他希望用户昵称的前半部分由一个回文串组成(即该部分字符串从前往后和从后往前读是完全相同的,空串也算回文串);后半部分应该由 八位数字 组成,应当是一个合法的日期,用来表示用户的生日。仅需考虑最简单的闰年规则,即 1582 年后的惯例 “四年一闰,百年不闰,四百年再闰”。

为了实现这一目标,Moca 需要编写一个昵称检验程序,以便在用户注册时即时验证昵称的合法性。你能帮 Moca 完成这个任务吗?

# 输入格式

第一行输入一个正整数 nn,表示要检验的用户名数(1n10001≤n≤1000)。

接下来 nn 行,每行一个字符串 ssss 的长度在 1110001000 之间(即不保证 ss 的长度一定大于等于 88);ss 仅有大小写字母和数字组成。当 ss 的长度大于等于 88 时,并不保证 ss 的后八个字符都是数字。

# 输出格式

对每行输入,如果合法对应输出 Yes ,如果不合法对应输出 No

# 输入样例

5
MocacoM20240901
MitakeMoca
Moca
20240901
MocacoM20230229

# 输出样例

Yes
No
No
Yes
No

# 题解:模拟

直接按照题意模拟即可。

时间复杂度O(L)O(L),其中 LL 为所有字符串长度之和。

参考代码:

#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;
}