微软编辑器的代码高亮 (恶心模拟)

微软的一款代码编辑器 VS Code 需要在编辑代码时将代码高亮。其中,有一个子问题是判断一串文本是否是 一个合法字符串。一个合法字符串是指由一对单引号或一对双引号包裹的文本字符集,字符集包括所有英文小写字母、单引号、双引号和斜杠(\)。

比如”abc”、’ab”c’都是一个合法的字符串,而”abc”de”、’ab”c’和abc都不是一个合法的字符串。

字符串中可能有转义字符,转义字符只有 333 种:\”、\’ 和 \,分别表示:字符串中的双引号、单引号和斜杠

当字符串由 双引号 包裹时,字符串中的 双引号 必须以转义字符出现,否则会被认为是不合法字符串;

当字符串由 单引号 包裹时,字符串的 单引号 必须以转义字符出现,否则会被认为是不合法字符串;

字符串中的斜杠(\)必须以转义字符出现,否则会被认为是不合法字符串。

输入格式

只有一行,表示输入的文本,文本的长度 lenlenlen 满足 1≤len≤100001 \leq len \leq 100001≤len≤10000。保证输入只包含英文小写字母、单引号、双引号和斜杠(\)。

输出格式

如果输入的一串文本是一个合法的字符串,则输出Yes,否则输出No。
样例输入1

“abc”

样例输出1

Yes

样例输入2

“abc”“def”

样例输出2

No

样例输入3

“ab\c”

样例输出3

No

好恶心的模拟,WA了一发,因为这让两句话
当字符串由 双引号 包裹时,字符串中的 双引号 必须以转义字符出现,否则会被认为是不合法字符串当字符串由 单引号 包裹时,字符串的 单引号 必须以转义字符出现,否则会被认为是不合法字符串
太恶心了!!!!!

#include
using namespace std;

const int maxn=10005;
char a[maxn];
char s[maxn];

int main() {
    while(~scanf("%s",a)) {
        int len=strlen(a);
        bool ans=true;
        if(len<2) {
            ans=false;
        }
        int f=-1;
        if(ans&&a[0]=='\''&&a[len-1]=='\'')f=0;
        if(ans&&a[0]=='"'&&a[len-1]=='"')f=1;
        if(f==-1)ans=false;
        if(len<=2){
            puts(ans?"Yes":"No");continue;
        }
        a[0]=a[len-1]='*';
        for(int i=0;iif(a[i]=='*')continue;
            if(a[i]=='\\'){
                a[i]='*';
                if(i+11]=='\''||a[i+1]=='"'||a[i+1]=='\\'))a[i+1]='*';
                else ans=false;
            }
            if(a[i]=='\''){
                if(i-1>=0&&a[i-1]=='\\')a[i]=a[i-1]='*';
                else if(f==1);
                else ans=false;
            }
            if(a[i]=='\"'){
                if((i-1>=0&&a[i-1]=='\\'))a[i]=a[i-1]='*';
                else if(f==0);
                else ans=false;
            }
        }
        int top=0;
        for(int i=0;(iif(a[i]!='*')a[top++]=a[i];
        }
        len=top;
        for(int i=0;ans&&(iif(a[i]=='\''&&f==0)ans=false;
            if(a[i]=='"'&&f==1)ans=false;
            if(a[i]=='\\')ans=false;
        }
        puts(ans?"Yes":"No");
    }
    return 0;
}

你可能感兴趣的:(ACM_模拟)