题解:P12005 【MX-X10-T1】[LSOT-4] 如何用中间忘了写一篇排版整齐的题解?

· · 题解

题目简述

给你一段字符串,只包括 a@1$,_ 中的字符,要求不能出现相邻的 @a1$ 中的任意一个字符,也不能出现 ,a1$ 中的任意一个字符存在 一个或多个 _。如果违反了以上规定,输出 No,反之输出 Yes

主要思路

十分明显的%你题,第一条规定可以直接在遍历到 @ 是判断是否有 a1$ 中的任意一个字符相邻就行了;

第二条规定可以在遍历到 , 时,如果左边是 _,那么向左一直判断是否存在 a1$ 中的任意一个字符,直到到达边界或再遇到 _,右边同理。

AC Code

#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int INT_INF = 0x3f3f3f3f;
const long long LL_INF = 0x3f3f3f3f3f3f3f3f;
template<typename T1, typename T2, typename T3> T1 _pow(T1 a, T2 b, T3 mod = LL_INF) { T1 x = 1, y = a; while(b > 0) {if (b & 1) x = x * y % mod; y = y * y % mod; b >>= 1; } return x; }
// ----------------------------

// ----------------------------

// ----------------------------

int main() {
    string s; cin >> s;
    // ----------------------------
    int idx;
    bool flag = true;
    int n = s.length();
    for (int i = 0; i < n - 1; i++) {
        if (s[i] == '@') {
            if (i > 0 && (s[i - 1] == 'a' || s[i - 1] == '1' || s[i - 1] == '$') ||
                s[i + 1] == 'a' || s[i + 1] == '1' || s[i + 1] == '$') flag = false;
        }
        else if (s[i] == ',') {
            if (i > 0 && s[i - 1] == '_') {
                idx = i - 2;
                while (idx >= 0) {
                    if (s[idx] == 'a' || s[idx] == '1' || s[idx] == '$') flag = false;
                    if (s[idx] != '_') break;
                    idx--;
                }
            }
            if (s[i + 1] == '_') {
                idx = i + 2;
                while (idx < (int)s.length()) {
                    if (s[idx] == 'a' || s[idx] == '1' || s[idx] == '$') flag = false;
                    if (s[idx] != '_') break;
                    idx++;
                }
            }
        }
    }
    // ----------------------------
    if (flag) cout << "Yes";
    else cout << "No";
    return 0;
}