QOJ-8211 Enumerating Substrings

Enumerating Substrings - QOJ 8211

字符集大小为 \(k\)。定义「优美串」为每个字符出现不超过 2 次的串。

定义 \(F(S, P)\) 为模式串 \(P\) 在文本串 \(S\) 中最多不重叠出现次数。

求所有长为 \(n\) 的串 \(S\) 与长为 \(m\)优美\(P\)\(F(S, P)\) 之和,对 \(10^9+7\) 取模。

\(1\le n\le10^6\)\(1\le m\le2000\)\(m\le n\)\(1\le k\le10^9\)

(下面用 \(st\) 表示 \(s\)\(t\) 两个字符串拼接。)

考虑优美字符串有什么特殊性质,特别是与「互不重叠」这一性质有关的。

如果前后两个 \(P\) 能重叠,说明前一个 \(P\) 的后缀等于后一个 \(P\) 的前缀(即重叠部分是一个 border)。

下面我们需要考虑两种情况:

  • 如果 \(P\) 没有 border,则 \(P\)\(S\) 中的出现位置一定两两互不重叠。

  • 如果 \(P\) 有 border,优美串的结构保证了,不存在诸如 \(\texttt{abacaba}\) 这种有「双层 border」的情况。即

    \[P=sts, \]

    其中:

    • \(s\) 中字符两两互不相同;
    • \(t\) 为优美串;
    • \(s\)\(t\) 的字符集不相交。

\(P\)唯一 border 长度为 \(\boldsymbol d\),即 \(|s|=d\),那么有 \(|t|=m-2d\)

\(P\) 没有 border,则 \(d=0\);若 \(P\) 有 border,则 \(d\ge1\)。由于 \(|P|=m\) 的长度限制,又不存在双层 border,显然有 \(d\le\lfloor m/2\rfloor\)

下面先考虑 \(1\le d\le\lfloor m/2\rfloor\) 的情况。

对于上述形式的 \(P\),一旦 \(S\) 中存在一个形如 \(ststs\cdots s=(st)^xs\) 的极长段,则其贡献为 \(\lceil x/2\rceil\)\(F(S,P)\) 即为所有贡献之和。

由于有重复计数,考虑容斥。设 \(P_j=(st)^js\)\(cnt(S,P)\) 表示 \(P\)\(S\) 中的总出现次数,手模一下可以发现 \(P_j\) 的贡献正好满足:

\[F(S,P)=\sum_{j\ge1}(-1)^{j-1}cnt(S,P_j). \]

事实上,有公式:

\[\left\lceil\frac x2\right\rceil=\sum_{j=1}^x(-1)^{j-1}(x-j+1)=x-(x-1)+(x-2)-(x-3)+\cdots+(-1)^{x-1}. \]

证明:

  • 如果 \(x\) 为偶数,则 \(x,x-1\) 相减,\(x-2,x-3\) 相减,以此类推,最终有 \(x/2\) 对,故右侧结果为 \(x/2=\lceil x/2\rceil\)
  • 如果 \(x\) 为奇数,则仍然如此两两配对,最终剩下最后的 \(+1\),故右侧结果为 \(\lfloor x/2\rfloor+1=\lceil x/2\rceil\)

因此,对所有 \(\lceil x/2\rceil\) 逐个求和,就相当于计算上述交错和式的每一项 \((x-j+1)\) 在整个串中的总贡献,即出现次数 \(cnt(S,P_j)\) 乘以容斥系数 \((-1)^{j-1}\)

由于 \(S\) 遍历了字符集上的所有排列,那么 \(s,t\) 具体是什么并不重要,重要的是每种字符的出现次数。

固定 \(P_j=(st)^js\),计算所有 \(\boldsymbol S\) 的贡献,其中 \(s,t\)任意字符串。

这是一个简单的组合计数问题,首先设 \(L_j=|P_j|=(j+1)d+j(m-2d)=j(m-d)+d\)(保证 \(L_j\le n\)),则可以填入 \(P\) 的位置有 \(n-L_j+1\) 个,而其他位置可以任意填,故方案数为

\[\sum_Scnt(S,P_j)=(n-L_j+1)\cdot k^{n-L_j}, \]

进而,对于固定的 border 长度 \(d\)(满足 \(1\le d\le\lfloor m/2\rfloor\)),遍历所有 \(S\) 的总贡献为

\[f(d)=\sum_{j\ge1,L_j\le n}(-1)^{j-1}\cdot(n-L_j+1)\cdot k^{n-L_j},\quad L_j=j(m-d)+d. \]

同样地,考虑 \(d=0\) 的情况。计算 \(P=t\) 在所有 \(S\) 中的出现次数之和,就相当于考虑每一个 \(P\)\(S\) 中的可能出现位置 \(i\),那么 \(S[i..i+m-1]=P\),而其余 \(n-m\) 个位置随意填充,故总答案为

\[f(0)=(n-m+1)\cdot k^{n-m}. \]


下面考虑对于给定的 border 长度 \(d\),优美模式串 \(P=sts\) 的种类数。

首先考虑 \(t\) 的方案数,设 \(G(K,M)\) 表示用 \(K\) 种字符构成长度为 \(M\) 的优美串的方案数。枚举使用的字符种类数量 \(c\),设出现两次的有 \(b\) 种,出现一次的有 \(c-b\) 种,那么有 \(2b+(c-b)=M\),即 \(b=M-c\),故出现一次的有 \(\boldsymbol{2c-M}\) 种,出现两次的有 \(\boldsymbol{M-c}\)。其满足 \(c\le\min\{K,M\}\),且 \(c\ge\lceil M/2\rceil\)。故

\[G(K,M)=\sum_{c=\lceil M/2\rceil}^{\min\{K,M\}}\binom Kc\binom c{M-c}\cdot\frac{M!}{2^{M-c}}, \]

其中 \(\dfrac{M!}{2^{M-c}}\) 为多重集排列数 \(\dbinom M{\underbrace{2,2,\cdots,2}_{M-c\,{\text{个}}},\underbrace{1,1,\cdots,1}_{2c-M\,{\text{个}}}}\)

再枚举 \(|s|=d\)\(0\le d\le\lfloor m/2\rfloor\)),则 \(|t|=m-2d\)

  • 对于 \(1\le d\le\lfloor m/2\rfloor\)\(s\) 为排列数 \(\dfrac{k!}{(k-d)!}=k^{\underline d}\),故此类优美串数量为

    \[num(d)=k^{\underline d}\cdot G(k-d,m-2d). \]

  • 对于 \(d=0\),为了避免重复计数,还需要保证 \(t\) 没有 border。由于优美串总数为 \(G(k,m)\),故此类优美串数量为

    \[num(0)=G(k,m)-\sum_{d=1}^{\lfloor m/2\rfloor}num(d). \]


最后计算答案。用 border 长度为 \(d\) 的模式串的种类数 \(num(d)\),乘上所有 \(S\) 对任意指定 border 长度 \(d\) 的模式串的总贡献 \(f(d)\),故总答案为

\[ans=\sum_{d=0}^{\lfloor m/2\rfloor}num(d)\cdot f(d). \]


实现细节:

  • 注意 \(G\) 的计算中,\(\dbinom Kc\) 由于 \(k\) 很大不能直接计算,考虑对求和的式子递推:

    \[\frac{\dbinom Kc\dbinom c{M-c}\cdot\dfrac{M!}{2^{M-c}}}{\dbinom K{c-1}\dbinom{c-1}{M-c+1}\cdot\dfrac{M!}{2^{M-c+1}}}=\frac{2(K-c+1)(M-c+1)}{(2c-M)(2c-M-1)}. \]

    首项为

    \[\binom K{c_0}\binom{c_0}{M-c_0}\cdot\frac{M!}{2^{M-c_0}}=\frac{K^{\underline{c_0}}}{c_0!}\cdot\binom{c_0}{M-c_0}\cdot\frac{M!}{2^{M-c_0}}. \]

预处理阶乘及其逆元、\(2\) 的幂的逆元、\(m\) 以内所有数的逆元,时间复杂度 \(O(m)\)。预处理 \(k\) 的幂,时间复杂度 \(O(n)\)

计算所有 \(num\),时间复杂度 \(O(m^2)\)。计算所有 \(f\),时间复杂度 \(\displaystyle\sum_d\frac n{m-d}=O(n\log m)\)

故总复杂度为 \(O(m^2+n\log m)\)Submission #2804124 - QOJ.ac

事实上 \(G\) 本身也可以递推计算,复杂度可以降低为 \(O(m+n\log m)\)

posted @ 2026-08-23 02:36  f2021ljh  阅读(3)  评论(0)    收藏  举报