#CF2078F. 二进制子序列权值和

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

二进制子序列权值和

F. 二进制子序列权值和

时间与内存限制

  • 时间限制:33
  • 内存限制:256256 MB

定义

对于一个二进制字符串 vv,定义它的得分为: 在所有 ii0iv0\le i\le |v|)中,

F(v,1,i)F(v,i+1,v)F(v,1,i)\cdot F(v,i+1,|v|)

最大值

其中函数 FF 定义为:

$$F(v,l,r) = (r-l+1) - 2\cdot \operatorname{zero}(v,l,r) $$

zero(v,l,r)\operatorname{zero}(v,l,r) 表示子串 vlvl+1vrv_lv_{l+1}\dots v_r00 的个数。 若 l>rl>r,则 F(v,l,r)=0F(v,l,r)=0


题目描述

给定一个长度为 nn 的二进制字符串 ss,以及 qq 次询问。

每次询问给定一个位置 ii1in1\le i\le n),你需要翻转 sis_i

  • 0011
  • 1100

每次翻转后,你需要求出: 当前 ss 的所有非空子序列 vv 的得分之和,答案对 998244353998244353 取模。

修改是持久的,即每次翻转会保留到后续询问。


输入格式

第一行一个整数 tt1t1041\le t\le 10^4),表示测试用例组数。

每组数据:

  • 第一行两个整数 n,qn,q1n,q2×1051\le n,q\le 2\times 10^5)。
  • 第二行一个长度为 nn 的二进制字符串 ss
  • 接下来 qq 行,每行一个整数 ii,表示翻转第 ii 位。

保证所有测试用例的 n\sum nq\sum q 均不超过 2×1052\times 10^5


输出格式

对于每次询问,输出一行一个整数,表示所有非空子序列的得分之和对 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。 各子序列得分分别为: 0,0,1,0,1,1,20,0,1,0,1,1,2,总和为 55