首页 > 其他分享 >NC10066 从后台研发到跑路

NC10066 从后台研发到跑路

时间:2022-11-06 11:45:12浏览次数:79  
标签:P1 R2 int 引号 研发 后台 NC10066 O1 define

题目描述

链接:https://ac.nowcoder.com/acm/contest/20960/1006
来源:牛客网

vigoss18是一个强烈的强迫症患者,他的代码都符合下面这些规则:
1.所有的注释都是/**/风格的,两个星号中间的内容为注释内容,需要把这个符号和里面的内容全部去掉
2.代码中经常会出现引号,用来表示字符串,如果/**/出现在引号内部,那么就认为不是注释,是不能被去掉的
3.vigoss18的代码保证不会出现/**/镶套,但是可能会出现/*/**/和/**/*/这种情况,对于前者,有两个/*,第一个先匹配,第二个/*被认为是注释内部的内容;对于后者,第一个*/被匹配,第二个*/找不到左边匹配的,所以被认为是文本,需要保留下来。
4.代码中可能会出现一半注释符号,比如单独的/*,或者单独的*/,这个时候认为不是注释,需要保留下来.
5.注释外的引号,保证一定是合法的,即每个引号一定是有对应的另一个引号成对匹配的。
6.代码中可能会出现引号前面有反斜杠的情况,那么这时引号会被转义,只被认为是个单纯的符号,不起到匹配字符串的效果。
7.代码保证只有引号才有转义的情况发生,即除了引号,其他符号都不需要考虑前面有反斜杠然后被转义。

不是很简单的思路

可以用编译原理中的状态机来描述. 做出状态机的转移图, 如下.
transfer

  • 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

相关文章