CF2065H Bro Thinks He's Him

题目描述

Skibidus 自认为是"天选之人"!他通过解决这个难题证明了这一点。你也能证明自己吗? 给定一个二进制字符串 $^{\text{∗}}$ $t$,定义 $f(t)$ 为将 $t$ 分割成由相同字符组成的连续子串的最小数量。例如,$f(\texttt{00110001}) = 4$,因为 $t$ 可以被分割为 $\texttt{[00][11][000][1]}$,每个括号内的子串均由相同字符组成。 Skibidus 给你一个二进制字符串 $s$ 和 $q$ 次查询。每次查询会翻转字符串中的一个字符(即 $\texttt{0}$ 变为 $\texttt{1}$,$\texttt{1}$ 变为 $\texttt{0}$),且修改会保留到后续查询。每次查询后,你需要输出所有非空子序列 $^{\text{†}}$ $b$ 的 $f(b)$ 之和模 $998\,244\,353$ 的结果。 $^{\text{∗}}$ 二进制字符串仅包含字符 $\texttt{0}$ 和 $\texttt{1}$。 $^{\text{†}}$ 字符串的子序列是指通过删除原字符串中若干(可能为零)个字符得到的新字符串。

输入格式

第一行包含一个整数 $t$($1 \leq t \leq 10^4$)——测试用例数量。 每个测试用例的第一行包含一个二进制字符串 $s$($1 \leq |s| \leq 2 \cdot 10^5$)。 每个测试用例的第二行包含一个整数 $q$($1 \leq q \leq 2 \cdot 10^5$)——查询次数。 每个测试用例的第三行包含 $q$ 个整数 $v_1, v_2, \ldots, v_q$($1 \leq v_i \leq |s|$),表示第 $i$ 次查询翻转 $s_{v_i}$ 处的字符。 保证所有测试用例的 $|s|$ 之和与 $q$ 之和均不超过 $2 \cdot 10^5$。

输出格式

对于每个测试用例,在一行中输出 $q$ 个整数——每次查询后的答案模 $998\,244\,353$。

说明/提示

第一个测试用例在第一次查询后,$s$ 变为 $\texttt{001}$。计算所有子序列的 $f$ 值: - $f(s_1) = f(\texttt{0}) = 1$ - $f(s_2) = f(\texttt{0}) = 1$ - $f(s_3) = f(\texttt{1}) = 1$ - $f(s_1 s_2) = f(\texttt{00}) = 1$ - $f(s_1 s_3) = f(\texttt{01}) = 2$ - $f(s_2 s_3) = f(\texttt{01}) = 2$ - $f(s_1 s_2 s_3) = f(\texttt{001}) = 2$ 这些值的总和为 $10$,模 $998\,244\,353$ 后结果为 $10$。 翻译由 DeepSeek R1 完成