1 条题解
-
0
题意分析
- 语言字符集:赫多尼亚语仅由字符
p
到z
以及N
、C
、D
、E
、I
组成。 - 语法规则:
- 单个字符
p
到z
构成的字符串是正确的句子。 - 如果
s
是正确的句子,那么在其前面加上N
后得到的Ns
也是正确的句子,这里N
是一元操作符。 - 如果
s
和t
都是正确的句子,那么Cst
、Dst
、Est
和Ist
都是正确的句子,这里C
、D
、E
、I
是二元操作符。
- 单个字符
- 输入输出要求:输入若干个赫多尼亚语句子,每个句子以换行符结束,句子集合以文件结束符终止。对于每个输入的句子,判断其是否符合语法规则,符合则输出
YES
,不符合则输出NO
,输出顺序与输入顺序一致,每个答案后跟随一个换行符,答案列表后跟随一个文件结束符。
解题思路
- 逆向处理:由于操作符
N
、C
、D
、E
、I
都是作用于其后面的字符或句子,为了方便处理,先将输入的字符串进行反转。这样,操作符就会在其作用的元素前面,便于我们按照语法规则进行判断。 - 统计有效元素:遍历反转后的字符串,当遇到字符
p
到z
时,将有效元素计数器cnt
加 1,因为这些字符代表一个正确的句子(基本单元)。 - 处理操作符:
- 当遇到
N
时,检查当前有效元素计数器cnt
是否为 0,如果为 0,说明没有可供N
操作的有效元素,直接返回false
;否则,继续处理下一个字符。 - 当遇到
C
、D
、E
、I
时,检查cnt
是否小于 2,如果小于 2,说明没有足够的有效元素供其进行二元操作,返回false
;否则,将cnt
减 1,因为二元操作会消耗两个有效元素并生成一个新的有效元素(合成后的句子)。
- 当遇到
- 最终判断:遍历完字符串后,检查有效元素计数器
cnt
是否等于 1,如果等于 1,说明经过一系列操作后,最终只剩下一个有效元素,符合语法规则,返回true
;否则,返回false
。
代码实现
#include <iostream> #include <cstring> #include <algorithm> using namespace std; char s[300]; bool solve() { int len = strlen(s); reverse(s, s + len); // 反转字符串 int cnt = 0; for (int i = 0; s[i]; ++i) { if (s[i] >= 'p' && s[i] <= 'z') ++cnt; // 遇到原子命题,有效元素加1 else if (s[i] == 'N') { if (cnt == 0) return false; // N 操作符需要有一个有效元素 } else if (s[i] == 'C' || s[i] == 'D' || s[i] == 'E' || s[i] == 'I') { if (cnt < 2) return false; // 二元操作符需要有两个有效元素 --cnt; // 二元操作消耗两个有效元素,生成一个新的有效元素 } else return false; // 遇到其他字符,不符合语法规则 } return cnt == 1; // 最终有效元素数量为1,符合语法规则 } int main() { while (cin >> s) { if (solve()) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
- 语言字符集:赫多尼亚语仅由字符
- 1
信息
- ID
- 127
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者