#CF2077C. 二进制子序列价值之和

    ID: 6358 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>数据结构动态规划组合数学多项式快速傅里叶变换线性代数*2300

二进制子序列价值之和

C. 二进制子序列价值之和
每个测试的时间限制:3 秒
内存限制:256 MB

Last | Moment - onoken

对于一个二进制字符串 vv,其得分定义为:

$$\max_{0 \le i \le |v|} \left[ F(v, 1, i) \cdot F(v, i+1, |v|) \right] $$

其中 $F(v, l, r) = r - l + 1 - 2 \cdot \text{zero}(v, l, r)$,zero(v,l,r)\text{zero}(v, l, r) 表示 vlvl+1vrv_l v_{l+1} \dots v_r00 的个数。如果 l>rl > r,则 F(v,l,r)=0F(v, l, r) = 0


题目描述

你有一个长度为 nn 的二进制字符串 ss,以及一个正整数 qq

你会收到 qq 个询问。

每个询问给你一个整数 ii1in1 \le i \le n),你需要将 sis_i 翻转(00111100)。
对于每次修改后的字符串,你需要求出所有非空子序列的得分之和。

由于结果可能很大,输出答案对 998244353998244353 取模。

注意:修改是持久化的(即每次修改会影响后续询问)。


定义

  • 二进制字符串:只包含字符 01 的字符串。
  • 子序列:可以通过删除若干(可能为零或全部)字符得到的字符串。

输入

每个测试包含多个测试用例。
第一行包含测试用例的数量 tt1t1041 \le t \le 10^4)。

每个测试用例的格式如下:

  • 第一行包含两个整数 nnqq1n21051 \le n \le 2 \cdot 10^51q21051 \le q \le 2 \cdot 10^5)——字符串长度和修改查询次数。
  • 第二行包含长度为 nn 的二进制字符串 ss
  • 接下来 qq 行,每行一个整数 ii1in1 \le i \le n),表示翻转 sis_i

保证所有测试用例的 nn 之和以及 qq 之和均不超过 21052 \cdot 10^5


输出

对于每个测试用例,输出 qq 行,每行一个整数 —— 对应每次修改后的答案(模 998244353998244353)。


示例

输入:

3
3 2
010
1
3
10 3
0101000110
3
5
10
24 1
011001100110000101111000
24

输出:

1
5
512
768
1536
23068672

示例解释

第一个测试用例,第一次修改后 s=110s = 110,所有非空子序列的得分之和为 11
第二次修改后 s=111s = 111,所有非空子序列的得分之和为 55