华东师范--EOJ Monthly 2019.1d

D. 唐纳德先生与 .DOC

单测试点时限: 6.0 秒

内存限制: 1024 MB

去年夏天的时候,唐纳德先生就注意到学校饮水机上挂了一个新的牌子:天热冷水需求量大。当时他还不以为意,这不过是一个普通的牌子。于是,天冷了。有一天他注意到牌子上面新增了一个交换的记号。原来,现在牌子要改成「天冷热水需求量大」了,但由于新的标语和旧的标语唯一的区别就是相邻的两个汉字交换了,所以维护人员为了省事儿,就直接在上面做了个记号。

唐纳德先生觉得这件事情很有趣,在自然语言中,交换相邻的两个字符或是单词,产生的句子在语法上仍然说得通这一现象其实并不少见。例如:

唐纳德最近发现交换相邻的单词不一定影响语法上的正确性。

交换「唐纳德」和「最近」,可以变成:

最近唐纳德发现交换相邻的单词不一定影响语法上的正确性。

这句话不仅在语法上合法,在语义上也是等价的。还有在语义上不等价的交换,在语法上也是合法的。例如交换「一定」和「不」:

最近唐纳德发现交换相邻的单词一定不影响语法上的正确性。

为了研究这一问题,唐纳德先生找了大量的语言材料,来分析交换相邻单词对语法合法性的影响。由于一般的自然语言处理常常需要用到大量高深的知识,唐纳德先生选取的语言材料来自一种名为 .DOC 的语言。这种语言的语法具有非常严苛的规则,可以用下面的上下文无关文法表示(其中 s 为开始符号,小写字母都是非终结符):

s ::= d 'O' c
d ::= 'D' | '.' s
c ::= 'C' | '.' s

现在给出一句合法的句子,要求对于所有可能的相邻字母的交换确认交换后的句子的合法性。

如果读到这里你已经知道怎么做这道题了,你可以跳过剩下的题目描述,直接跳到输入格式。但我还是想再啰嗦几句,以防你完全不知道上下文无关文法是什么。

简单的来说,.DOC 语言只有一种句子结构,就是经典的主谓宾结构。D 表示主语,O 表示谓语,C 表示宾语。例如 DOC 就是一句合法的句子。该语言允许使用主语从句和宾语从句。主语从句以 . 开头,后面是一句合法的句子;宾语从句也是以 . 开头,后面是一句合法的句子。例如 DO.DOC 的宾语是 .DOC;例如 ..DOCOCOC 也是合法的。对于一句句子,如果你可以用上面所提到的语法规则来解释,那么它就是合法的。

输入

输入第一行是一个整数 t (1≤t≤105),表示数据组数。

随后有 t 行,每行一个由 ., D, O, C 组成的字符串 s (3≤|s|≤106)。保证这是一句合法的句子。

输入保证所有数据的长度之和不超过 106。

输出

对于每组数据,输出一个长度为 |s|−1 的字符串。字符串的第 i (1≤i≤|s|−1) 个字符表示交换字符串的第 i 个字符和第 i+1 个字符后,字符串是否依然合法。如果合法,该位置填 C (Correct);如果非法,该位置填 D (Doomed)。

输入:3
DOC
DO.DOC
..DOCOCOC
输出:

DD
DDDDD
CDDDDDDD
思路:

经仔细思考发现只有..时才会c其他都是d

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
	int t;char a[1000005];
	cin>>t;
	while(t--)
	{
		memset(a,0,sizeof(a));
		scanf("%s",a);
		int l=strlen(a);
		for(int i=0;i<l-1;i++)
		{
			if(a[i]=='.'&&a[i+1]=='.')
			{
				putchar('C');
			}
			else
			printf("D");
		}
		printf("\n");
	}
	return 0;
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-lyslyslys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值