#P4879. 「PA 2025」Podciągi

    ID: 5487 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>数据结构线段树动态规划状压DP组合数学线性代数矩阵乘法字符串处理

「PA 2025」Podciągi

题目描述

题目译自 PA 2025 Runda 5 Podciągi

你有一个长度为 nn 的字符串 ss,由字母集 $\{\texttt{a}, \texttt{b}, \texttt{c}, \texttt{d}, \texttt{e}, \texttt{f}\}$ 组成。接下来会对它进行 qq 次操作,每次操作是替换字符串中的一个字母。

考虑字符串 ss 的所有子序列集合 XsX_s,也就是通过删除某些字母后得到的所有可能字符串(多重集)。

你的任务是跟踪一个信息:在 XsX_s 中,有多少不同的非空字符串 tt 至少出现了两次。

比如,对于字符串 ababa\texttt{ababa},有 66 个这样的字符串 tt

  • 字符串 a\texttt{a}XsX_s 中出现 33 次。
  • 字符串 b\texttt{b}XsX_s 中出现 22 次。
  • 字符串 ab\texttt{ab}XsX_s 中出现 33 次(分别删去位置 3,4,53,4,52,3,52,3,51,2,51,2,5 的字母)。
  • 字符串 ba\texttt{ba}XsX_s 中出现 33 次(分别删去位置 1,4,51,4,51,3,41,3,41,2,31,2,3 的字母)。
  • 字符串 aa\texttt{aa}XsX_s 中出现 33 次(分别删去位置 2,4,52,4,52,3,42,3,41,2,41,2,4 的字母)。
  • 字符串 aba\texttt{aba}XsX_s 中出现 44 次(分别删去位置 4,54,53,43,42,32,31,21,2 的字母)。

请你算出初始字符串 ss 以及每次操作后 ssXsX_s 中符合条件的字符串 tt 的数量。因为这些数字可能很大,输出它们对 998244353998244353 取模的结果。


输入格式

输入的第一行包含两个整数 nnqq (3n500003 \leq n \leq 50000, 0q500000 \leq q \leq 50000),分别表示字符串长度和操作次数。

第二行是一个长度为 nn 的字符串,仅由小写字母 a\texttt{a}f\texttt{f} 组成。

接下来的 qq 行描述操作,每行包含一个整数 pip_i (1pin1 \leq p_i \leq n) 和一个字母 ziz_i ($z_i \in \{\texttt{a}, \texttt{b}, \texttt{c}, \texttt{d}, \texttt{e}, \texttt{f}\}$),表示将 ss 中第 pip_i 位置的字母替换为 ziz_i


输出格式

输出 q+1q+1 行,每行一个整数。第 ii 行表示初始状态或前 i1i-1 次操作后的 ss 中,XsX_s 内至少出现两次的不同字符串 tt 的数量,结果对 998244353998244353 取模。


样例

输入:

4 3
abca
1 a
4 d
2 c

输出:

1
1
0
4

以下是字符串 ss 在每次更新后的状态,以及作为 ss 子序列至少出现两次的字符串 tt

  • 初始字符串:abca\texttt{abca},符合条件的子序列:{a}\{\texttt{a}\}
  • 第一次操作后:abca\texttt{abca}(不变),符合条件的子序列:{a}\{\texttt{a}\}
  • 第二次操作后:abcd\texttt{abcd},符合条件的子序列:{}\{\}
  • 第三次操作后:accd\texttt{accd},符合条件的子序列:$\{\texttt{a}, \texttt{c}, \texttt{ac}, \texttt{cc}\}$