1 条题解

  • 0
    @ 2025-4-22 20:51:33

    题意分析

    1. 语言字符集:赫多尼亚语仅由字符 pz 以及 NCDEI 组成。
    2. 语法规则
      • 单个字符 pz 构成的字符串是正确的句子。
      • 如果 s 是正确的句子,那么在其前面加上 N 后得到的 Ns 也是正确的句子,这里 N 是一元操作符。
      • 如果 st 都是正确的句子,那么 CstDstEstIst 都是正确的句子,这里 CDEI 是二元操作符。
    3. 输入输出要求:输入若干个赫多尼亚语句子,每个句子以换行符结束,句子集合以文件结束符终止。对于每个输入的句子,判断其是否符合语法规则,符合则输出 YES,不符合则输出 NO,输出顺序与输入顺序一致,每个答案后跟随一个换行符,答案列表后跟随一个文件结束符。

    解题思路

    1. 逆向处理:由于操作符 NCDEI 都是作用于其后面的字符或句子,为了方便处理,先将输入的字符串进行反转。这样,操作符就会在其作用的元素前面,便于我们按照语法规则进行判断。
    2. 统计有效元素:遍历反转后的字符串,当遇到字符 pz 时,将有效元素计数器 cnt 加 1,因为这些字符代表一个正确的句子(基本单元)。
    3. 处理操作符
      • 当遇到 N 时,检查当前有效元素计数器 cnt 是否为 0,如果为 0,说明没有可供 N 操作的有效元素,直接返回 false;否则,继续处理下一个字符。
      • 当遇到 CDEI 时,检查 cnt 是否小于 2,如果小于 2,说明没有足够的有效元素供其进行二元操作,返回 false;否则,将 cnt 减 1,因为二元操作会消耗两个有效元素并生成一个新的有效元素(合成后的句子)。
    4. 最终判断:遍历完字符串后,检查有效元素计数器 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
    上传者