#THU20172B. 工资

    ID: 232 Type: Default 1000ms 512MiB Tried: 2 Accepted: 1 Difficulty: 4 Uploaded By: Tags>清华推研机试夏令营模拟有限状态自动机字符串处理

工资

时间限制: 1.0 秒

空间限制: 512 MB

题目背景

wangyurzee7 和 Yazid 是好朋友。

题目描述

wangyurzee7 是一个繁忙的工作者,他每天都要写很多有趣的代码。

Yazid 开了一家有趣的公司,wangyurzee7 当上了有趣的公司的项目经理。这家公司给码农们结算工资的方式也十分有趣,每个人的薪水正比于所写代码的长度。不过很快,有趣的码农们学会了使用长长的变量名、大括号换行、增加长长的注释、tab 换成空格等等方法,这让 Yazid 头疼不已。

有一天,wangyurzee7 收到了 Yazid 的一个任务:在这个月结算工资之前,写一个脚本把程序中所有的注释全部去掉,再将所有的函数名、变量名替换成单个字母,然后再进行统计代码长度。

这个任务非常简单,但 wangyurzee7 实在是太弱了,他只在 github 上找到了批量替换函数名的轮子,而没有找到去掉注释和替换变量名的轮子,而且这个代码看起来不是那么有趣,wangyurzee7 写不动。

Yazid 勃然大怒,他根本没想到这么简单的任务 wangyurzee7 都不能胜任。他把 wangyurzee7 狠狠地批判了一番。

当然啦,责任还是要由 wangyurzee7 来承担。无奈之下,他只好退而求其次,只需要针对 C/C++ 代码,去掉里面的注释就向 Yazid 交差:

1.单行注释 //:一旦出现,并且被 C/C++ 编译器认为是注释,那么从 // 符号开始到行末都被算作注释,比如下面程序的 //233 就会被算作注释:

#include <cstdio>
int main()
{
    printf("//");//233
    return 0;
}

并且如果单行注释最末尾的可见字符为 \ 字符,则下一行从行初到行末均被认为是注释

2.多行注释 /* */:一旦出现,并且被 C/C++ 编译器认为是注释,那么从 /* 符号开始到 */ 符号结束都被算作注释,比如下面程序的 141 \sim 4 行就会被算作注释:

/* Welcome to THUSCU2017!
 * This is the easiest problem!
 * \\\\\\\puts("\\\\\\\/**\///////");///////
 *///
int main(/**//**/){return!printf("%d",'//');}

3.注释的处理方法:对于每个注释,将从注释的开始一直到注释的结束的字符串,替换成一个空格,其他地方的代码不允许做任何改动。将处理完的代码输出即可。比如上面的两段代码会变成下面这样(第一份代码第四行最末尾有一个空格,第二份代码第一行有两个空格):

#include <cstdio>
int main()
{
    printf("//"); 
    return 0;
}
  
int main(  ){return!printf("%d",'//');}

既然要做的东西变少了,问题也就变得更简单了。请你帮帮可怜的 wangyurzee7 解决这个问题。

输入格式

从标准输入读入数据。

输入有若干行,每一个测试样例都是一个能够在 C/C++ 编译器下编译运行的代码,里面包含了若干注释。

输出格式

输出到标准输出。

输出经过删除注释,并在原位置替换空格过后的 C/C++ 代码。

请注意,本题采用严格判题方式,即不忽略行末空格以及文件尾换行符

#include <cstdio>
int main()
{
    printf("//");//233
    return 0;
}
#include <cstdio>
int main()
{
    printf("//"); 
    return 0;
}
/* Welcome to THUSCU2017!
 * This is the easiest problem!
 * \\\\\\\puts("\\\\\\\/**\///////");///////
 *///
int main(/**//**/){return!printf("%d",'//');}
  
int main(  ){return!printf("%d",'//');}
#include <bits/stdc++.h>
int main(int argc, char const *argv[])
{
    printf("\"../**/...//%s...","/etc//apt//sources.list");///\/*.\./*\
    printf("\"../**/...//%s...","/etc//apt//sources.list");///\\.\./*\
    return 0;/*
}
#include <bits/stdc++.h>
int main(int argc, char const *argv[])
{
    printf("\"../**/...//%s...","/etc//apt//sources.list"); 
}

子任务

对于 30%30\% 的数据,保证只有单行注释 //,但是并不保证不跨行。

对于另外 40%40\% 的数据,保证只有多行注释 /* */,但是并不保证不跨行。

存在 30%30\% 的数据,保证注释没有跨行情况。

对于 100%100\% 的数据,保证代码总长度不超过 20KB,所有字符都是常用可见字符或者空格、tab、换行符,并且不含 ASCII 标准之外的字符(如中文、拓展 ASCII 表等等),所有测试数据中的程序均可用 C/C++ 编译器编译运行。保证以字符 # 作用的行(包含 include、宏定义相关语句)中,引号成对出现,并且不包含以 \ 结尾的单行注释;单行注释若出现跨行情况,必定是 \ 字符之后紧跟换行符。

提示

请注意考虑各种字符串情况,诸如:

  1. 字符串转义:"/*\"//*/"
  2. 字符常量:'//"'