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

· · 题解

可以观察出规则中的英文、数字或公式都是捆绑在一起的。而且,连续的多个空格跟单个空格是等价的。

所以,可以先对这个字符串进行处理,方便后续判断:

接着相邻的两两判断:是否有出现中文和英文、数字或公式之间没有空格。如果有,输出 No 然后终止程序。

再相邻的三三判断:是否有出现中文标点和英文、数字或公式之间有空格。如果有,输出 No 然后终止程序。

如果都没出现那些情况,输出 Yes

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin>>s;
    string a="";//处理之后的串
    int n=s.size();
    for(int i=0;i<n;i++){
        if(i==0||(!(s[i]=='_'&&s[i-1]=='_'))){
            if(s[i]=='_'){
                a+=' ';
            }
            if(s[i]=='a'||s[i]=='$'||s[i]=='l'){
                a+='0';
            }
            if(s[i]=='@'){
                a+='1';
            }
            if(s[i]==','){
                a+='2';
            }
        }
    }//处理字符串,方便判断
    n=a.size();
    for(int i=1;i<n;i++){//两两判断
        if(a[i]=='1'&&a[i-1]=='0'){
            cout<<"No";
            return 0;
        }
        if(a[i-1]=='1'&&a[i]=='0'){
            cout<<"No";
            return 0;
        }
    }
    for(int i=1;i+1<n;i++){//三三判断
        if(a[i]==' '&&a[i-1]=='0'&&a[i+1]=='2'){
            cout<<"No";
            return 0;
        }
        if(a[i]==' '&&a[i-1]=='2'&&a[i+1]=='0'){
            cout<<"No";
            return 0;
        }
    }
    cout<<"Yes";
}