[Muse Dash] 乐串

传送门 luogu U139568

题目背景

(Welcome ~~ to~ ~Muse~ Dash ~!)

题目描述

题目共给出 (T) 组字符串。你需要对题目中每组字符串 (s) 进行判断操作。

  • 长条:以两个字符 O (大写字母 O)为起点和终点的字符串。它分为 “合法长条” 和 “不合法长条” 两种。题目所给的每组字符串里可以包含多个长条。

  • 连接符:字符 - (减号)。它仅能出现在长条的起点和终点之间,一个长条中可以有多个连接符。

  • 占位符:字符 .(25) 个大写英文字母(没有大写 O ) 。它们仅能出现在长条之外,起占位作用。

  • 合法长条:在长条中间可以有并且仅能有连接符连接,也可以没有连接符连接;而且此长条的起点不能为其他长条的终点,此长条的终点不能为其他长条的起点,即字符 O 不能同时为两个不同长条的组成元素。

如果一个长条不满足上述合法长条的定义,那么这个长条就为 “不合法长条” 。

寻找字符串中长条的顺序:从左至右。各个长条分别取交集的集合都必须为空集。即如果已经找到一个字符 O 为长条的起点,那么右边离它最近的字符 O 就必须为这个长条的终点。具体见样例的第 (4) 组数据。

题目所给的每组字符串分为 “黑乐串” 和 “白乐串”。符合黑乐串的条件为:

  1. 本组字符串中有 “不合法长条” 。
  2. 连接符出现在了长条外。
  3. 存在一长条只有起点没有终点。

白乐串即为非黑乐串的字符串。现在,你需要判断每组字符串是白乐串还是黑乐串。

输入格式

第一行为两个字符 T= 和一个正整数 (T)(T) 代表数据组数。

在每组数据中:第一行输入一个正整数 (n) ,代表字符串长度,第二行输入一个非空字符串 (s) ,代表需要判断的字符串。

字符串 (s) 中的每个字符保证为 (26) 个大写英文字母 和 .- 之一。确保每个字符串 (s) 中都出现字符 O

输出格式

输出共 (T) 行。

每一行为 YesNo ,分别代表该组数据是白乐串或黑乐串。

样例输入 #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
  1. 对于字符串 .OO. ,其中包含一个合法长条 ([2,3]) 。注意合法长条的定义。
  2. 对于字符串 O-OOO ,其中包含 (2) 个合法长条,分别为 ([1,3],[4,5])
  3. 对于 O--OO-OOOO-O.OO ,包含 (5) 个合法长条,分别为 ([1,4],[5,7],[8,9],[10,12],[14,15])
#2
  1. 对于 -O--O ,字符 (1) 不应该出现在长条外。
  2. 对于 O-.-O ,字符 (3) 不应该出现在长条内。
  3. 对于 O-O-O-O ,存在两个合法长条:([1,3],[5,7]) 。对于字符 (4) ,因为在 ([1,3]) 已经构成长条,则字符 (4) 位于长条外,这是被禁止的。
  4. 对于 O-O.I.AK.IOOI.AK..O--(长度为21) ,字符 (19) 之前无异常现象。字符 (19) 作为新长条的起点,在它右边没有找到终点。
原文地址:https://www.cnblogs.com/EdisonBa/p/14075688.html