#P17285. [2024年南开中学集训]匹配

[2024年南开中学集训]匹配

题目描述

考虑有如下字符串匹配问题:

  • 给定长度为 mm 的字符串 TT 和长度为 nn 的字符串 SS,对于每一个 i[1,n]i\in[1,n],求出最大的自然数 jj,使得 jmin(m,i)j\le\min(m,i)S[ij+1,i]=T[1,j]S[i-j+1,i]=T[1,j],将此 jj 称为 fif_i

其中 S[i,j]S[i,j] 表示从 SiS_iSjS_jSS 的子串,若 i>ji>j 则表示空串。

考虑如下算法:

  • 维护一个变量 curcur,初始 cur=0cur=0
  • 依次枚举 i=1,,ni=1,\ldots,n
  • cur<mcur<mSi=Tcur+1S_i=T_{cur+1},则 curcur+1cur\leftarrow cur+1,否则 cur0cur\leftarrow0
  • ficurf_i\leftarrow cur

可以用如下伪代码来描述这个算法:

procedure MATCH(n, m, s, t)
    i ← 1
    cur ← 0
    while i ≤ n do
        if cur < m And s[i] = t[cur + 1] then
            cur ← cur + 1
        else
            cur ← 0
        end if
        f[i] ← cur
    end while
    return f
end procedure

你一定会发现这个算法是错误的,例如当 S=aaabS=\texttt{aaab}T=aabT=\texttt{aab} 时,正确的 ff 数组为 [1,2,2,3][1,2,2,3],而该算法得到的 ff 数组为 [1,2,0,0][1,2,0,0]

请求出对于给定的 SS,该算法的正确率,具体来说:

  • 给定一个长度为 nn 的字符串 SS 和一个整数 mm,若随机选取一个长度为 mm 的字符串 TT(即每一位出现每种字母概率均等),按照如上错误算法算出的每个 fif_i 都与正确的 fif_i 一致的概率,答案对 998244353998244353 取模。

注意:S,TS,T 的字符集均为 $\{\texttt{a},\texttt{b},\texttt{c},\texttt{d},\texttt{e}\}$,即给定的 SS 只包含这些字符,TT 等概率取由这些字符组成的字符串。

输入格式

第一行两个整数 n,mn,m,分别表示 SS 的长度和 TT 的长度。

第二行,一个长度为 nn、字符集为 $\{\texttt{a},\texttt{b},\texttt{c},\texttt{d},\texttt{e}\}$ 的字符串 SS

输出格式

输出一行,一个整数,表示算法正确概率对 998244353998244353 取模的结果。

样例输入

3 2
aba

样例输出

678806161

样例解释

T=abT=\texttt{ab} 时,正确的 f3=1f_3=1 和该算法得到的 f3=0f_3=0 不同。对于其余的 TT,该算法均能得到正确的结果,所以有 521=245^2-1=24TT 使得该算法正确,所以输出

2425mod998244353=678806161\frac{24}{25}\bmod 998244353=678806161

数据范围

对于 100%100\% 的数据满足:1n,m20001\le n,m\le2000SS 的字符集为 $\{\texttt{a},\texttt{b},\texttt{c},\texttt{d},\texttt{e}\}$。

  • 对于 15%15\% 的数据:1n,m81\le n,m\le8
  • 对于 45%45\% 的数据:1n,m1001\le n,m\le100
  • 对于另外 15%15\% 的数据:1n,m161\le n,m\le16,且 SS 的字符集为 {a,b}\{\texttt{a},\texttt{b}\}(这并不代表 TT 的字符集也是 {a,b}\{\texttt{a},\texttt{b}\})。