F. 重构
- 时间限制:每个测试点 2 秒
- 内存限制:每个测试点 256 兆字节
存在一个隐藏的数组 a1,a2,…,an,长度为 n,其元素是介于 −m 和 m 之间的整数(包含端点)。
给定一个长度为 n 的数组 b1,b2,…,bn 以及一个长度为 n 的字符串 s,字符串由字符 P、S 和 ? 组成。
对于每个 i(1≤i≤n),必须满足:
- 若 si=P,则 bi 等于 a1 到 ai 的和(前缀和)。
- 若 si=S,则 bi 等于 ai 到 an 的和(后缀和)。
输出将 s 中所有 ? 替换为 P 或 S 的方案数,使得存在一个数组 a1,a2,…,an,其每个元素的绝对值不超过 m,且满足由数组 b 和字符串 s 所给出的约束。
由于答案可能很大,请对 998244353 取模后输出。
输入
第一行包含一个整数 t(1≤t≤103)——测试用例的数量。
每个测试用例的第一行包含两个整数 n 和 m(2≤n≤2⋅103,2≤m≤109)——隐藏数组 a1,a2,…,an 的长度以及元素绝对值上限。
每个测试用例的第二行包含一个字符串 s,长度为 n,由字符 P、S 和 ? 组成。
每个测试用例的第三行包含 n 个整数 b1,b2,…,bn(∣bi∣≤m⋅n)。
所有测试用例的 n 之和不超过 5⋅103。
输出
对于每个测试用例,输出一个整数 —— 使得存在有效数组 a 的替换方案数,对 998244353 取模。
示例
输入
6
4 10
PSPP
1 9 8 10
4 1000000000
????
1 1 1 4000000000
8 1000000000
?P?SSP?P
-857095623 -1424391899 -851974476 673437144 471253851 -543483033 364945701 -178537332
4 7
PPSS
4 2 1 3
9 20
?????????
1 2 3 4 5 6 7 8 9
3 1000000000
P??
-145463248 -974068460 -1287458396
输出
1
0
2
1
14
1
注
在第一个测试用例中,可以验证如下数组满足所有约束,因此答案为 1:
- s1=P:a=[1,3,4,2],b1=1(前缀和)
- s2=S:a=[1,3,4,2],b2=3+4+2=9(后缀和)
- s3=P:a=[1,3,4,2],b3=1+3+4=8
- s4=P:a=[1,3,4,2],b4=1+3+4+2=10
在第二个测试用例中,可以证明不存在数组 a 满足所有 ∣ai∣≤m=109 且满足约束。