题目背景
本试题为 2024 年厦门市小学生 C++ 语言复赛试题,数据为洛谷自造。
初赛为笔试。
题目描述
小唐最近在研究一个长为 n 的 01 字符串 S(下标从 1 开始)。
他很喜欢其子区间和子序列,例如:如下表的 01 字符串 S=01011010。
S1 |
S2 |
S3 |
S4 |
S5 |
S6 |
S7 |
S8 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
- 子区间 [2,4] 即为:S2,S3,S4 这样一个在原 S 串中连续的一段序列;
- 子序列即类如:S2,S4,S6,S7 这样一个按原 S 串顺序的,可连续、可不连续的序列。
所以,子区间肯定是子序列,但子序列不一定是子区间。
小唐会询问你 Q 次,每次询问给出一个 S 的子区间 [l,r],他想知道是否存在 S 的一个“有趣子序列”,其满足:
-
“有趣子序列”和询问的子区间 [l,r] 相同;
例:如果询问的子区间是 [2,4],其中,子序列 S2,S6,S7 和询问的子区间 S2,S3,S4 中的字符按顺序一一对应相同;
-
“有趣子序列”不是从 S 中选出的一段子区间。
例:子序列 S2,S6,S7 并不是原 S 串中连续的一段序列,即不是原 S 串的一段子区间。
请对于每次询问 [l,r],输出 Yes 或 No,分别表示存在或不存在这样的 “有趣子序列”。
输入格式
本题有多组数据。
- 第一行一个非负整数 T,表示数据组数。
- 接下来 T 组数据,对于每组数据:
- 第一行两个非负整数 n 和 q,表示字符串长度和询问数。
- 第二行一个 01 字符串 s。
- 接下来 q 行,每行两个正整数 l,r,表示询问的子区间。
输出格式
对于每组数据:
- 对于每个询问,输出一行 Yes 或 No 表示答案。
2
6 3
011100
2 4
1 3
3 5
5 2
11111
1 5
2 3
No
Yes
Yes
No
Yes
提示
样例解释 1
- 对于第一组数据,可以选择的子序列下标依次为:不存在,(1,2,4),(3,4,6)。
- 对于第二组数据,可以选择的子序列下标依次为:不存在,(1,3)。
数据范围
对于所有数据,满足 1≤n≤1×105,1≤q≤1×105,1≤l≤r≤n。
数据点编号 |
T≤ |
n≤ |
q≤ |
特殊性质 |
1 |
100 |
4 |
1 |
|
2 |
10 |
3 |
10 |
12 |
100 |
4 |
100 |
5,6 |
1000 |
7 |
5 |
1×105 |
l=1 |
8,9,10 |
|
特殊性质:l=1 表示子区间左边界为 1。