题目描述
给定一个长度为 n、字符集为 K,D 的字符串 s。保证所有测试点中,字符串 s 均存在特殊性质限制,详见「数据范围」。
对 s 的一个长度为 m 的子串
t1t2…tm,
考虑它的一个标号 c1,c2,…,cm,满足:
- 对所有 1≤i≤m,有 1≤ci≤n,且 ci∈Z;
- 二元组 (ti,ci) 两两不同。也就是说,若 i=j 且 ti=tj,则 ci=cj。
有一个小人,从位置 1 游行到位置 m,初始有无穷的金币。当访问到第 i 个位置时:
- 若 ti 为
K,他将领取一把类型为 ci 的钥匙;
- 若 ti 为
D,他需要开一扇类型为 ci 的门,也就是需要手里有类型为 ci 的钥匙。若有该类型钥匙,则可以直接通过;否则需要求救大神,花费一个金币。
定义合法标号 c1∼m 的代价为最少需要花费的金币数。
记 fmin(t1∼m) 为对所有合法标号 c1∼m,其代价的最小值。可以证明,至少存在一个合法标号方案。小人将能取得 fmin(t1∼m) 的合法标号数量记为 f(t1∼m)。
现在有 q 次询问。第 i 次询问给出一个区间 [li,ri],请你求出
f(slisli+1…sri)
对 998244353 取模后的结果。
输入格式
从文件 keys.in 中读入数据。
本题包含多组测试数据。
输入第一行包含两个非负整数 c,T,分别表示测试点编号与测试数据组数。c=0 表示该测试点为样例。
接下来依次输入每组测试数据。对于每组测试数据:
- 第一行两个正整数 n,q;
- 第二行一个长度为 n 的字符串 s;
- 接下来 q 行,每行两个整数 li,ri,表示一次询问。
输出格式
输出到文件 keys.out 中。
对于每组测试数据,输出 q 行。第 i 行输出一个非负整数,表示对应询问的答案,对 998244353 取模。
样例 1 输入
0 1
4 3
KKDD
1 3
3 4
1 4
样例 1 输出
24
12
24
样例 1 解释
第二组询问的子串只有门没有钥匙,所以不管怎样标号,小人都需要求救大神两次,因此总方案数是 4×3=12。
第一组询问中,一种标号方式是 (c1,c2,c3)=(1,2,3),需要求救一次;但它不是最优的,因为例如 (c1,c2,c3)=(1,2,2) 时不需要求救。
附加样例
- 样例 2:见选手目录下的
keys/keys2.in 与 keys/keys2.ans,满足测试点 4 的约束条件。
- 样例 3:见选手目录下的
keys/keys3.in 与 keys/keys3.ans,满足测试点 5 的约束条件。
- 样例 4:见选手目录下的
keys/keys4.in 与 keys/keys4.ans,满足测试点 12、14 的约束条件。
数据范围
对于每组测试数据,均有:
- 1≤T≤3;
- 1≤n≤3×105,1≤q≤5×105;
- 1≤li≤ri≤n;
- 对所有 1≤i≤n,si 为
K、D 之一。
| 测试点编号 |
n≤ |
∑n≤ |
q≤ |
∑q≤ |
特殊性质 |
| 1, 2 |
5 |
15 |
50 |
150 |
C |
| 3, 4 |
18 |
50 |
500 |
103 |
| 5, 6 |
5×103 |
104 |
5×103 |
104 |
B |
| 7 ~ 10 |
C |
| 11 ~ 14 |
105 |
2×105 |
105 |
2×105 |
| 15, 16 |
1.5×105 |
3×105 |
2.5×105 |
5×105 |
B |
| 17, 18 |
C |
| 19, 20 |
3×105 |
5×105 |
106 |
特殊性质如下:
- 特殊性质 A:奇数编号测试点满足:对所有 1≤i≤q,若 li<ri,则 fmin(sli∼ri)=0。
- 特殊性质 B:保证 si=si+1。
- 特殊性质 C:保证 s 在 2n 个合法字符串中等概率随机生成。
请注意:所有测试点均存在特殊性质。本题输入输出量较大,建议使用较快的输入输出方式。
难度评定
- 估计难度:NOI Day2 T1 ~ T2 难度,CF 约 2900 ~ 3100。
- 评定理由:最小代价本质上与序列中
K 与之后 D 的最大匹配有关,但本题还要求统计所有达到最小代价的合法标号数,并支持大规模区间询问。计数部分需要组合分析,查询部分需要结合特殊性质 A/B/C 设计不同策略,整体明显高于普通括号匹配或区间计数题。