202301H 新年快乐 题解
[语言月赛202301] 新年快乐 题解
Source & Knowledge
2023 年 1 月语言月赛,由洛谷网校入门计划/基础计划提供。
文字题解
题目大意
给定一个只含小写字母的字符串
给出
解析
C++ 的 string 类提供了很多很有用的功能。这里我们会用到其提供的 substr() 与 find() 两个函数。
对于一个 string 类型变量 s.substr(l, r) 返回值可被转换为 string 类,返回内容为以
对于两个 string 类型变量 s.find(t) 代表查找 npos。大多数情况下 npos 的值为 -1。
需要注意的是,find() 函数近似于暴力匹配,时间复杂度为平方级别。但是本题数据规模相对较小,这种方式可以通过。
下面将这两个函数运用到题目中。
对于每次询问,我们调用 s.substr(l - 1, r - l + 1) 得到子字符串
我们注意到,
详细说明:假设
t 中有一个位置的字母不是小写字母\texttt{a} ,那么在取t 的「上一个字符串」时,我们一定可以找到一个位置使其变为其的上一个字母,在这个位置之后进行一定的修改便可找到t 的上一个字符串。如果t 全部由小写字母\texttt{a} 构成,那么我们找不到任何一个位置可以变为上一个字母。由此,我们便无法找到「上一个字符串」。
因此,我们首先需要判断 NULL\nHappy Chinese New Year!\n。
核心代码如下:
int flag = 1;
for (int i = 0; i < t.length(); ++i) {
if (t[i] != 'a') {
flag = 0;
break;
}
}
if (flag) {
cout << "NULL\nHappy Chinese New Year!\n";
}
确认
核心代码如下:
for (int i = t.length() - 1; i >= 0; --i)
if (t[i] == 'a') {
t[i] = 'z';
} else {
--t[i];
break;
}
最后,我们调用 s.find(t),判断返回值是否为 npos 即 -1,进行对应的输出即可。
核心代码如下:
cout << t << endl;
if (s.find(t) != -1) {
cout << "Happy New Year!\n";
} else {
cout << "Happy Chinese New Year!\n";
}
视频题解
完整代码请在视频中查看。