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\) 的贡献正好满足:
事实上,有公式:
\[\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\) 个,而其他位置可以任意填,故方案数为
进而,对于固定的 border 长度 \(d\)(满足 \(1\le d\le\lfloor m/2\rfloor\)),遍历所有 \(S\) 的总贡献为
同样地,考虑 \(d=0\) 的情况。计算 \(P=t\) 在所有 \(S\) 中的出现次数之和,就相当于考虑每一个 \(P\) 在 \(S\) 中的可能出现位置 \(i\),那么 \(S[i..i+m-1]=P\),而其余 \(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\)。故
其中 \(\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)\),故总答案为
实现细节:
- 注意 \(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)\)。

浙公网安备 33010602011771号