#B4181. [厦门小学生 C++ 2024] 有趣子序列

[厦门小学生 C++ 2024] 有趣子序列

题目背景

本试题为 2024 年厦门市小学生 C++ 语言复赛试题,数据为洛谷自造。

初赛为笔试。

题目描述

小唐最近在研究一个长为 nn0101 字符串 SS(下标从 11 开始)。

他很喜欢其子区间和子序列,例如:如下表的 0101 字符串 S=01011010S = \tt{01011010}

S1S_1 S2S_2 S3S_3 S4S_4 S5S_5 S6S_6 S7S_7 S8S_8
00 11 00 11 00 11 00
  • 子区间 [2,4][2,4] 即为:S2,S3,S4S_2, S_3, S_4 这样一个在原 SS 串中连续的一段序列;
  • 子序列即类如:S2,S4,S6,S7S_2, S_4, S_6, S_7 这样一个按原 SS 串顺序的,可连续、可不连续的序列。

所以,子区间肯定是子序列,但子序列不一定是子区间。

小唐会询问你 QQ 次,每次询问给出一个 SS 的子区间 [l,r][l,r],他想知道是否存在 SS 的一个“有趣子序列”,其满足:

  1. “有趣子序列”和询问的子区间 [l,r][l,r] 相同;
    例:如果询问的子区间是 [2,4][2,4],其中,子序列 S2,S6,S7S_2, S_6, S_7 和询问的子区间 S2,S3,S4S_2, S_3, S_4 中的字符按顺序一一对应相同;

  2. “有趣子序列”不是从 SS 中选出的一段子区间。
    例:子序列 S2,S6,S7S_2, S_6, S_7 并不是原 SS 串中连续的一段序列,即不是原 SS 串的一段子区间。

请对于每次询问 [l,r][l,r],输出 Yes\tt{Yes}No\tt{No},分别表示存在或不存在这样的 “有趣子序列”。

输入格式

本题有多组数据。

  • 第一行一个非负整数 TT,表示数据组数。
  • 接下来 TT 组数据,对于每组数据:
    • 第一行两个非负整数 nnqq,表示字符串长度和询问数。
    • 第二行一个 0101 字符串 ss
    • 接下来 qq 行,每行两个正整数 l,rl,r,表示询问的子区间。

输出格式

对于每组数据:

  • 对于每个询问,输出一行 Yes\tt{Yes}No\tt{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)(1,2,4)(3,4,6)(3,4,6)
  • 对于第二组数据,可以选择的子序列下标依次为:不存在,(1,3)(1,3)

数据范围

对于所有数据,满足 1n1×1051 \leq n \leq 1 \times 10^51q1×1051 \leq q \leq 1 \times 10^51lrn1 \leq l \leq r \leq n

数据点编号 TT\leq nn\leq qq\leq 特殊性质
11 100100 44 11
22 1010
33 1010 1212 100100
44 100100
5,65, 6 10001000
77 55 1×1051 \times 10^5 l=1l=1
8,9,108, 9, 10

特殊性质:l=1l=1 表示子区间左边界为 11