#HK4879. 「PA 2025」Podciągi

「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,5;2,3,52,3,5 或 1,2,51,2,5 的字母)。
  • 字符串 ba\texttt{ba} 在 XsX_{s} 中出现 33 次(分别删去位置 1,4,51,4,5;1,3,41,3,4 或 1,2,31,2,3 的字母)。
  • 字符串 aa\texttt{aa} 在 XsX_{s} 中出现 33 次(分别删去位置 2,4,52,4,5;2,3,42,3,4 或 1,2,41,2,4 的字母)。
  • 字符串 aba\texttt{aba} 在 XsX_{s} 中出现 44 次(分别删去位置 4,54,5;3,43,4;2,32,3 或 1,21,2 的字母)。

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

输入格式

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

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

接下来的 qq 行描述操作,每行包含一个整数 pip_{i} (1≤pi≤n)(1 \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 行表示初始状态或前 i−1i-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},子序列:{ac, acd, cd, c}\{\texttt{ac, acd, cd, c}\}