题目描述
链接:https://ac.nowcoder.com/acm/contest/20960/1006
来源:牛客网
vigoss18是一个强烈的强迫症患者,他的代码都符合下面这些规则:
1.所有的注释都是/**/风格的,两个星号中间的内容为注释内容,需要把这个符号和里面的内容全部去掉
2.代码中经常会出现引号,用来表示字符串,如果/**/出现在引号内部,那么就认为不是注释,是不能被去掉的
3.vigoss18的代码保证不会出现/**/镶套,但是可能会出现/*/**/和/**/*/这种情况,对于前者,有两个/*,第一个先匹配,第二个/*被认为是注释内部的内容;对于后者,第一个*/被匹配,第二个*/找不到左边匹配的,所以被认为是文本,需要保留下来。
4.代码中可能会出现一半注释符号,比如单独的/*,或者单独的*/,这个时候认为不是注释,需要保留下来.
5.注释外的引号,保证一定是合法的,即每个引号一定是有对应的另一个引号成对匹配的。
6.代码中可能会出现引号前面有反斜杠的情况,那么这时引号会被转义,只被认为是个单纯的符号,不起到匹配字符串的效果。
7.代码保证只有引号才有转义的情况发生,即除了引号,其他符号都不需要考虑前面有反斜杠然后被转义。
不是很简单的思路
可以用编译原理中的状态机来描述. 做出状态机的转移图, 如下.
- Q 引号模式
- R 引号中引号转义模式
- T Text 文本模式
- R2 文本引号转义模式
- P1 进入注释前的步骤
- C 进入注释模式
- O1 预备出注释模式
然后就可以有A_B表示\(A\to B\)的一个转移关系. 构建一个dfa的转移关系矩阵即可.
标上序号之后就可以进行处理了. 见第三部分.
Code
#include <bits/stdc++.h>
using namespace std;
#define F(i, a, b) for(int i=a; i<=b;i++)
#define Fd(i, a, b) for(int i=a;i>=b;i--)
#define MAXN 10010
#define pb push_back
#define Q 0
#define R 1
#define T 2
#define R2 3
#define P1 4
#define C 5
#define O1 6
#define T_Q (x == '\"')
#define Q_Q (x != '"' && x != '\\')
#define Q_T (x == '"')
#define Q_R (x=='\\')
#define R_Q (1)
#define T_T (x != '\\' && x != '"' && x != '/')
#define T_R2 (x == '\\')
#define R2_T (1)
#define T_P1 (x == '/')
#define P1_C (x=='*')
#define C_C (x != '*')
#define C_O1 (x == '*')
#define O1_C (x != '/' && x!='*')
#define O1_T (x =='/')
#define P1_T (x !='*')
#define O1_O1 (x=='*')
#define J(x) (state==x)
int state = T;
int nstate(int x){
int dfa[7][7]={
//Frm --> to
// Q R T R2 P1 C O1
/*Q*/ {Q_Q, Q_R, Q_T, 0, 0, 0, 0 },
/*R*/ {R_Q, 0 , 0 , 0, 0, 0, 0 },
/*T*/ {T_Q, 0 , T_T, T_R2, T_P1, 0, 0 },
/*R2*/ { 0, 0 , R2_T, 0, 0, 0, 0 },
/*P1*/ { 0, 0 , P1_T, 0, 0, P1_C, 0 },
/*C*/ { 0, 0 , 0 , 0, 0, C_C, C_O1 },
/*O1*/ { 0, 0 , O1_T, 0, 0, O1_C, O1_O1 },
};
F(i, 0, 6){
if(dfa[state][i]){
return i;
}
}
assert(0);
return -1;
}
int lbl[MAXN]={0};
vector<char> comm;
vector<char> code;
string s="$";
int main(){
string ln;
while(getline(cin, ln)){
s=s+ln+"\n";
}
// cout<<s<<endl;
int len = s.length()-1;
// cout<<len<<endl;
F(i, 1, len){
// printf("<%d,%c>", i,s[i]);
// cout<<nstate(s[i])<<"\n";
lbl[i] = nstate(s[i]);
state = nstate(s[i]);
}
#define LB lbl[i]
#define NU s[i]
F(i, 1, len-1){
// cout<<i<<" ";
if(LB == 0 || LB == 1 || LB == 2 || LB==3){
code.pb(NU);
}else if(LB==4){
if(lbl[i+1]==5){
comm.pb(NU);
comm.pb(s[i+1]);
i+=1;
continue;
}else{
code.pb(NU);
}
}else if(LB == 5){
comm.pb(NU);
}else if(LB == 6){
if(lbl[i+1]==2){
comm.clear();
i+=1;
continue;
}else{
comm.pb(NU);
}
}
}
for(char i:code){
cout<<i;
}
// cout<<"Hey\n";
for(char i:comm){
cout<<i;
}
}
标签:P1,R2,int,引号,研发,后台,NC10066,O1,define
From: https://www.cnblogs.com/augpath/p/16862273.html