Loading

[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\) 作为新长条的起点,在它右边没有找到终点。
posted @ 2020-12-02 19:05  EdisonBa  阅读(201)  评论(0)    收藏  举报