CF1679E Typical Party in Dorm

题目描述

今天是宿舍的节日——Oleh 到来了,为了庆祝,女生们送给了他一个字符串。Oleh 非常喜欢这个礼物,于是立刻想出了一个问题并让你这个最好的朋友来解决。 给定一个长度为 $n$ 的字符串 $s$,该字符串由前 $17$ 个小写拉丁字母(即 $\{a, b, c, \ldots, p, q\}$)和问号组成。还有 $q$ 个询问。每个询问给定一个由前 $17$ 个小写拉丁字母中两两不同的字母组成的集合,可以用来替换字符串 $s$ 中的问号。 对于每个询问,要求计算:将字符串 $s$ 中的问号用可用字符集中的字母替换后,所有可能得到的字符串中,不同的回文子串的数量之和。答案需要对 $998\,244\,353$ 取模。 注意!当子串的起始和结束位置不同,即使内容相同,也被认为是不同的子串。因此,对于字符串 aba,不同的回文子串有 $4$ 个:a、b、a、aba。 来看几个用字母替换问号的例子。例如,字符串 aba??ee,在询问 $\{a, b\}$ 时,可以得到 ababaee 或 abaaaee,但不能得到 pizza、abaee、abacaba、aba?fee、aba47ee 或 abatree。 回文串是指从左到右和从右到左读都相同的字符串。

输入格式

第一行包含一个整数 $n$($1 \le n \le 1\,000$),表示字符串 $s$ 的长度。 第二行包含字符串 $s$,由 $n$ 个小写拉丁字母和问号组成。保证所有字母都属于集合 $\{a, b, c, \ldots, p, q\}$。 第三行包含一个整数 $q$($1 \le q \le 2 \cdot 10^5$),表示询问的数量。 接下来 $q$ 行,每行一个字符串 $t$,表示可以用来替换问号的字符集合($1 \le |t| \le 17$)。保证所有字母都属于集合 $\{a, b, c, \ldots, p, q\}$,且在集合中最多出现一次。

输出格式

对于每个询问,输出一个整数,表示将字符串 $s$ 中的问号用可用字符集中的字母替换后,所有可能得到的字符串中不同回文子串的数量之和,对 $998\,244\,353$ 取模。

说明/提示

以第一个样例和第一个询问为例。我们只能得到一个字符串 abaaaba。它包含以下回文子串: 1. a —— 子串 $[1; 1]$。 2. b —— 子串 $[2; 2]$。 3. a —— 子串 $[3; 3]$。 4. a —— 子串 $[4; 4]$。 5. a —— 子串 $[5; 5]$。 6. b —— 子串 $[6; 6]$。 7. a —— 子串 $[7; 7]$。 8. aa —— 子串 $[3; 4]$。 9. aa —— 子串 $[4; 5]$。 10. aba —— 子串 $[1; 3]$。 11. aaa —— 子串 $[3; 5]$。 12. aba —— 子串 $[5; 7]$。 13. baaab —— 子串 $[2; 6]$。 14. abaaaba —— 子串 $[1; 7]$。 在第三个询问中,我们可以得到 4 个字符串:abaaaba、abababa、abbaaba、abbbaba。 由 ChatGPT 4.1 翻译