传送门 luogu U139568
题目背景
(Welcome ~~ to~ ~Muse~ Dash ~!)
题目描述
题目共给出 (T) 组字符串。你需要对题目中每组字符串 (s) 进行判断操作。
-
长条:以两个字符
O
(大写字母 O)为起点和终点的字符串。它分为 “合法长条” 和 “不合法长条” 两种。题目所给的每组字符串里可以包含多个长条。 -
连接符:字符
-
(减号)。它仅能出现在长条的起点和终点之间,一个长条中可以有多个连接符。 -
占位符:字符
.
和 (25) 个大写英文字母(没有大写O
) 。它们仅能出现在长条之外,起占位作用。 -
合法长条:在长条中间可以有并且仅能有连接符连接,也可以没有连接符连接;而且此长条的起点不能为其他长条的终点,此长条的终点不能为其他长条的起点,即字符
O
不能同时为两个不同长条的组成元素。
如果一个长条不满足上述合法长条的定义,那么这个长条就为 “不合法长条” 。
寻找字符串中长条的顺序:从左至右。各个长条分别取交集的集合都必须为空集。即如果已经找到一个字符 O
为长条的起点,那么右边离它最近的字符 O
就必须为这个长条的终点。具体见样例的第 (4) 组数据。
题目所给的每组字符串分为 “黑乐串” 和 “白乐串”。符合黑乐串的条件为:
- 本组字符串中有 “不合法长条” 。
- 连接符出现在了长条外。
- 存在一长条只有起点没有终点。
白乐串即为非黑乐串的字符串。现在,你需要判断每组字符串是白乐串还是黑乐串。
输入格式
第一行为两个字符 T=
和一个正整数 (T) ,(T) 代表数据组数。
在每组数据中:第一行输入一个正整数 (n) ,代表字符串长度,第二行输入一个非空字符串 (s) ,代表需要判断的字符串。
字符串 (s) 中的每个字符保证为 (26) 个大写英文字母 和 .
和 -
之一。确保每个字符串 (s) 中都出现字符 O
。
输出格式
输出共 (T) 行。
每一行为 Yes
或 No
,分别代表该组数据是白乐串或黑乐串。
样例输入 #1
T=4
4
O--O
4
.OO.
5
O-OOO
15
O--OO-OOOO-O.OO
样例输出 #1
Yes
Yes
Yes
Yes
样例输入 #2
T=4
5
-O--O
5
O-.-O
7
O-O-O-O
21
O-O.I.AK.IOOI.AK..O--
样例输出 #2
No
No
No
No
数据范围
对于前10%的数据,保证所有字符串为黑乐串 .
对于前30%的数据,保证 (T<10,n<200) .
对于前50%的数据, 保证 (T<20,n<5000) .
对于前80%的数据,保证 (T<30,n<50000) .
对于另外10%的数据,保证 (T=2,n=2333333) .
对于再另外10%的数据,保证 $ T=2,n=23333333$ .
时间限制:前90%的数据为 (1s),后10%的数据为 (2s) 。
空间限制:(10MB)
样例解释:
设每个字符串 (s) 中,从左往右数第一个字符的位置为 (1) 。
#1
- 对于字符串
.OO.
,其中包含一个合法长条 ([2,3]) 。注意合法长条的定义。 - 对于字符串
O-OOO
,其中包含 (2) 个合法长条,分别为 ([1,3],[4,5]) 。 - 对于
O--OO-OOOO-O.OO
,包含 (5) 个合法长条,分别为 ([1,4],[5,7],[8,9],[10,12],[14,15]) 。
#2
- 对于
-O--O
,字符 (1) 不应该出现在长条外。 - 对于
O-.-O
,字符 (3) 不应该出现在长条内。 - 对于
O-O-O-O
,存在两个合法长条:([1,3],[5,7]) 。对于字符 (4) ,因为在 ([1,3]) 已经构成长条,则字符 (4) 位于长条外,这是被禁止的。 - 对于
O-O.I.AK.IOOI.AK..O--
(长度为21) ,字符 (19) 之前无异常现象。字符 (19) 作为新长条的起点,在它右边没有找到终点。