2025.7.11 闲话
图



浅谈生成函数在字符串中的应用
记号
不会很详细的书写记号的定义,期望读者已经基本了解这些基本概念 .
字符串侧
字符集 \(\Sigma\) 是一个全序集,字符集内的元素 \(c\in\Sigma\) 被称为字符 .
一个字符串 \(S\) 是字符组成的序列,\(S_i\) 是序列的第 \(i\) 个元素(下标从 0 开始).
对于两个字符串 \(S,T\),二元关系 \(S<T\) 等比较字典序 .
对于两个字符串 \(S,T\),记 \(S\) 是 \(T\) 的前缀为 \(S\sqsubseteq T\),进而若 \(S\neq T\) 则 \(S\sqsubset T\) .
对于两个字符串 \(S,T\),\(\lcp(S,T)\) 是它们的最长公共前缀长度 .
对于一个字符串 \(S,T\),\(ST\) 是它们的拼接 . 对于字符串 \(S\) 和正整数 \(k\),\(S^k\) 是 \(S\) 拼接 \(k\) 次后的结果,例如 \(S^2=SS\) . 特别的,\(S^{\infty}=SSSS\cdots\) .
对于一个字符串 \(S\),\(T\) 是 \(S\) 的 border 当且仅当 \(S\) 同时是 \(T\) 的真前缀和真后缀 . 或者也说 \(k\) 是 \(S\) 的 border 当且仅当 \(S\) 长度为 \(k\) 的前缀是 \(S\) 的 border .
对于一个字符串 \(S\),\(T\) 是 \(S\) 的 period 当且仅当 \(S\) 是 \(T^{\infty}\) 的前缀 . 或者也说 \(k\) 是 \(S\) 的 period 当且仅当 \(S\) 长度为 \(k\) 的前缀是 \(S\) 的 period .
形式幂级数侧
对于形式幂级数 \(f\),\(\ord(f)\) 是最大的 \(k\) 使得 \(x^k\mid f\) .
字符串的生成函数
对于一个长度为 \(n\) 的字符串 \(S\),定义其生成函数
注意由于字符并不能做代数运算,所以在操作的时候需要注意不能让一个 \(x^i\) 的系数上出现多个 \(S_i\) . 或者也可以看成每个 \(S_i\) 都是形式变元,相加也不会合并(
后将 \(\mathcal I(S)(x)\) 简写为 \(\mathcal I(S)\) .
最长公共前缀
容易发现(需要时刻注意,此处的字符串下标从 0 开始):
\(S^{\infty}\) 与 Period
容易发现,对于长度为 \(n\) 的字符串 \(S\):
对于长度为 \(n\) 的字符串 \(S\) 和长度为 \(m\) 的字符串 \(T\):
可以试一下使用生成函数推导,明显还是比较方便的:
与 \(S^{\infty}\) 有关 LCP 的计算
对于两个字符串 \(X,Y\),\(\comp(X,Y)=\begin{cases}-1&X<Y\\0&X=Y\\1&X>Y\end{cases}\) .
对于字符串 \(X,Y\),有:
- \(\comp(X,YX)=\comp(X,Y^{\infty})\)
- \(\lcp(X,YX)=\lcp(X,Y^{\infty})\) .
对于字符串 \(X,Y\),有:
- \(\comp(XY,YX)=\comp(X^{\infty},Y^{\infty})\) .
- 若 \(XY\neq YX\) 则 \(\lcp(XY,YX)=\lcp(X^{\infty},Y^{\infty})\) .
证明
第一部分
令 \(n=|X|,\,m=|Y|,\,A=\mathcal I(X),\,B=\mathcal I(Y)\) .
则:
此处 \(\ord C=\ord\dfrac{C}{1-x^m}\) 且其符号即为 \(\comp(X,YX)\) .
第二部分
令 \(n=|X|,\,m=|Y|,\,A=\mathcal I(X),\,B=\mathcal I(Y)\) .
此处 \(\ord C=\ord\dfrac{C}{(1-x^n)(1-x^m)}\) 且其符号即为 \(\comp(XY,YX)\) .
Periodicity Lemma
若 \(p,q\) 都为字符串 \(S\) 的 period,且 \(p+q-\gcd(p,q)\le|S|\),则 \(\gcd(p,q)\) 也是 \(S\) 的 period .
证明
令
考察:
令上式 \(\mathrm{RHS}\) 括号里面等于 \(F(x,y)\),那么容易发现 \(F(x,y)\) 是关于 \(x\) 的多项式且 \(\deg F(x,y)<p+q-\gcd(p,q)\) .
由于 \(\mathrm{RHS}=\mathrm{LHS}\equiv0\pmod{x^n}\),而 \(\dfrac{1-x^{\gcd(p,q)}}{(1-x^p)(1-x^q)}\not\equiv0\pmod{x^n}\),从而 \(F(x,y)\equiv 0\pmod{x^n}\) .
由于 \(\deg F(x,y)<p+q-\gcd(p,q)\le n\),根据多项式推理法可以得到 \(F(x,y)=0\),进而可以简单推得 \(\dfrac{\mathcal I(P)}{1-x^p}=\dfrac{\mathcal I(Q)}{1-x^q}\),也即长度为 \(p,q\) 的 period \(P,Q\) 满足 \(P^{\infty}=Q^{\infty}\) .
接下来可以通过调用 WPL 来完成证明,而 WPL 的证明是(相对于 PL 来说)简单很多的(?
平方串
对于平方串来说除了方便写过程可能就没啥优势了 .
平方串间的前缀关系
对于字符串 \(U,V\) 满足 \(U^2\sqsubseteq V^2\) 且 \(2|U|\ge|V|\),则 \(|V|-|U|\) 是 \(U\) 的 period .
证明
\(U^2\sqsubseteq V^2\) 就相当于:
第三步:需要注意到由于 \(U\sqsubseteq V\) 那么 \(P=\dfrac{\mathcal I(V)-\mathcal I(U)}{x^u}\) 一定是整式 .
那么令 \(P\) 对应的字符串是 \(C\),则相当于 \(C+V\sqsubseteq U\),也即 \(C+U+C\sqsubseteq U\) 所以 \(C\) 显然是 \(U\) 的 period .
关于 \(2|U|\ge|V|\),只是用来保证 \(|V|-|U|\le |U|\)(
此结论可以导出 Three Squares Lemma:若 \(U^2,V^2,W^2\) 是本原平方串且 \(U^2\sqsubset V^2\sqsubset W^2\),则 \(|W|\ge|U|+|V|\) . 由于和本文关系不大故不展开说明,有兴趣者可自行查阅相关资料 .
总结
好像应用面有点过于狭窄(
关于涉及到这种周期或者 \(a^{\infty}\),只刻画前缀关系的的字符串问题,我们在明天明天中讨论了它的一种扩展,其中借助了本文所述的技术来辅助进行证明(不用也行).
关于明天明天怎么做
明天明天
对于字符串 \(S\),定义 \(\operatorname{shuffle}_k(S)\) 是将 \(S\) 中的每个字符向后循环移位 \(k\) 位得到的字符串。对于字符串 \(S\) 和非负整数 \(k\),按如下方法生成字符串序列 \(T\):
\[T_i=\begin{cases}S&i=0\\T_{i-1}\operatorname{shuffle}_{ik}(S)&i>0\end{cases} \]进而定义 \(S\) 关于 \(k\) 的的自描述字符串 \(f_k(S)=T_{10^{36}}\)。
现在给定 \(n\) 个字符串 \(S_1,S_2,\cdots,S_n\),构造一个长度为 \(n\) 的非负整数序列 \(a\),最大化:
\[V=\sum_{i=1}^n\sum_{j=1}^{i-1}\operatorname{lcp}(f_{a_j}(S_i),f_{a_i}(S_j)) \]的值。你只需要输出最大的 \(V\) 即可。如果最大的 \(V>10^{18}\) 输出
TAT。数据范围:\(1\le n,\sum|S_i|\le5\times10^5\)。保证每个字符串长度都形如 \(2^k\) 或 \(2^{k+1}\)。
后将 \(\operatorname{shuffle}_k(S)\) 简写为 \(\operatorname{shu}_k(S)\)。所述 Lemma 1/2 在文末附证明。
首先将自描述字符串的定义 \(f_k(S)=T_{10^{36}}\) 中的 \(R=10^{36}\) 看做一个充分大的数,也即若改变 \(R\) 的取值可以使得 \(V\) 任意大则输出 TAT,否则答案一定和 \(R\) 没有关系。容易证明修改后的题意和原题意等价。
Lemma 1\(\quad\)若 \(f_p(A)\neq f_q(B)\),则 \(\operatorname{lcp}(A\operatorname{shu}_p(B),B\operatorname{shu}_q(A))=\operatorname{lcp}(f_p(A),f_q(B))\)。
从而如果答案不是 TAT,就只需要构造非负整数序列 \(a\) 并最大化:
那么考虑首先特判 TAT 的情况,只需要判断是否存在 \(S_i,S_j\) 使得存在 \(p,q\) 让 \(f_p(S_i)=f_q(S_j)\)。那么类似 Lemma 1 也就相当于 \(S_i\operatorname{shu}_p(S_j)=S_j\operatorname{shu}_q(S_i)\)。
令 \(n=|S_i|\le m=|S_j|\),那么 \(u_1=S_i\operatorname{shu}_p(S_j),\,u_2=S_j\operatorname{shu}_q(S_i)\) 大概是这样的一个结构:

对于前面长度为 \(n\) 的位置必须匹配,所以这里要求 \(S_i\) 是 \(S_j\) 的前缀。可以在 Trie 树上找出每组本质不同的有前后缀关系的串,容易发现只有 \(O(\sum|S_i|)\) 组这样的串。(此前可能需要特判相同串)
那么只需要对于每个 \(S_i,S_j\) 计算中间长度为 \(m-n\) 的位置是否能通过 \(\mathrm{shuffle}\) 变换得到以及变换后后面长度为 \(n\) 的位置是否能通过 \(\mathrm{shuffle}\) 变换得到即可。
那么就变成对于两个字符串 \(A,B\) 找出一个 \(k\) 使得 \(A=\operatorname{shu}_k(B)\) 或报告不存在这样的 \(k\) 了。这里可以考虑对于每种字符 \(c\) 分别计算它在 \(A\) 中的位置和 \(B\) 中的位置,那么只需要判断是否存在一个 \(k\) 使得 \(c\) 在 \(A\) 中的位置和 \(c\) 平移 \(k\) 位后在 \(B\) 中的位置一样即可。
假设我们已经求出了每种字符 \(c\) 在 \(A\) 中的位置 \(p_c\) 和 \(B\) 中的位置 \(q_c\),那么问题相当于找出让 \(q\) 循环移位多少位能得到 \(p\),只需要把 \(p\) 复制两遍然后让 \(q\) 在上面做字符串匹配就可以了。
关于如何求每种字符 \(c\) 在 \(A,B\) 中的位置,可以考虑计算位置序列对应的 Hash 值,由于需要重标号下标所以此处最好使用 BKDR Hash(就是那个 \(\sum b^is_i\) 的 Hash)。
那么现在已经处理掉 TAT 的情况了,也就是对于每个 \(S_i,S_j\) 都不存在 \(p,q\) 使得 \(f_p(S_i)=f_q(S_j)\)。
注意到如果 \(S_i,S_j\) 没有前后缀关系那么 \(a_i,a_j\) 不会对 LCP 产生任何影响,此时需要计算 \(\sum_{i<j}\operatorname{lcp}(S_i,S_j)\)。注意到将 \(S\) 按字典序排序后有 \(\operatorname{lcp}(S_i,S_j)=\operatorname{min}_{k\in[i,j)}\operatorname{lcp}(S_k,S_{k+1})\)(在 Trie 树上考虑就是 NOIP2024 T4 的结论),那么问题转为计算一个序列每个区间的最小值之和。这是一个经典问题,可以使用你喜欢的算法解决。
对于有前后缀关系的 \(S_i,S_j\),只需要考虑它们能让 LCP 之和增加多少。不妨令 \(S_i\) 是 \(S_j\) 的前缀,可以类似处理 TAT 的方法考虑,重新放一下那个图:

前 \(n\) 位必然匹配,那么可以分几种情况(二分匹配长度可以计算出限制中的具体数值):
- 可以通过调整 \(a_i\) 使得中间长度为 \(m-n\) 的部分匹配 \(c\) 个元素,但是没有匹配满。
- 可以通过调整 \(a_i\) 使得中间长度为 \(m-n\) 的部分匹配满,进而可以通过调整 \(a_j\) 使得后面长度为 \(n\) 的部分匹配 \(c\) 个元素,但是没有匹配满。
注意这里最后一段不可能匹配满,要不然就是 TAT 的情况了。于是问题转化为对于序列 \(a\) 有若干个形式如下的限制:
- 限制 \((i,c,v)\):若 \(a_i=c\) 则可以收益 \(v\)。
- 限制 \((i,j,c_1,c_2,v)\):若 \(a_i=c_1,\,a_j=c_2\) 则可以收益 \(v\)。
问最大能得到多少收益。对于任意的限制,这个问题被称为 Max-SAT 问题。很遗憾,这是一个 NPC 问题。所以需要进一步寻找限制结构的性质。
Lemma 2\(\quad\)长度为 \(p,q,n\) 的字符串 \(P,Q,S\) 满足 \(f_a(P)\) 的前 \(n\) 位为 \(S\)、\(f_b(Q)\) 的前 \(n\) 位也为 \(S\)。若 \(p+q-\gcd(p,q)\le n\),则 \(f_a(P)=f_b(Q)\)。
可以发现如果存在第二种限制 \((i,j,c_1,c_2,v)\),那么 \(f_{c_1}(S_i)\) 的前 \(|S_j|\) 位必然为 \(S_j\)(可以通过观察图片得到),若存在两个限制 \((i_1,j,c_1,c_2,v_1),\,(i_2,j,d_1,d_2,v_2)\) 其中 \(i_1\neq i_2\),那么根据上述 Lemma 2 可以得出 \(f_{c_1}(S_{i_1})=f_{d_1}(S_{i_2})\),这与答案不为 TAT 矛盾!从而每个限制 \((i,j,c_1,c_2,v)\) 的 \(j\) 都互不相同。
Remark. 此处为什么能使用 Lemma 2?注意题目中的重要性质:字符串的长度必然形如 \(2^k\) 或 \(2^k+2^{k+1}\),也就是形如 \(2^k\) 或 \(3\cdot 2^k\)。令 \(S\) 是所有可能的字符串长度构成的集合,则需要证明对于任意 \(p,q,r\in S\) 且 \(p,q<r\) 都有 \(p+q-\gcd(p,q)\le r\)(这是 Lemma 2 的适用条件)。分类讨论:
- \(p,q\) 中至少一个没有因子 \(3\):可以发现此时显然有 \(p+q\le r\)。
- \(p,q\) 都有因子 \(3\):令 \(p=3\cdot 2^x,\,q=3\cdot 2^y\),则 \(p+q-\gcd(p,q)=3\cdot(2^x+2^y-2^{\min\{x,y\}})=3\cdot2^{\max\{x,y\}}=\max\{p,q\}<r\)。
那么也就证明了结论,也即在本题中任意串之间都满足 Lemma 2 的使用条件。
那么也就表明对于每个限制 \((i,j,c_1,c_2,v)\) 连边 \(i-j\) 可以得到一棵森林结构。对每棵树分别考虑,可以直接在树上进行 DP:令 \(dp_{u,c}\) 表示只考虑 \(u\) 的子树,且 \(a_u=c\) 的最大收益。转移平凡不表。
假设 \(n\) 和 \(\sum|s_i|\) 同阶,那么问题在 \(O(n|\Sigma|\log n)\) 的时间复杂度内得到解决。
(数据没有针对任何合理的 Hash 算法做任何针对性的构造)
那么 Lemma 1/2 如何证明呢?
对于下标从 \(0\) 开始的长度为 \(n\) 的字符串 \(S\),考察系数在 \(\Z/|\Sigma|\Z\) 上的二元形式幂级数:
注意到 \((1+ay)(1+by)\equiv (1+(a+b)y)\pmod{y^2}\),那么有 \(\displaystyle\mathcal I(f_k(S))=\dfrac{\mathcal I(S)}{1-(1+ky)x^n}\)。
找到了对 \(f\) 的一个良好的刻画,就可以着手证明结论了。
Lemma 1\(\quad\)若 \(f_p(S)\neq f_q(T)\),则 \(\operatorname{lcp}(S\operatorname{shu}_p(T),T\operatorname{shu}_q(S))=\operatorname{lcp}(f_p(S),f_q(T))\)。
对于关于 \(x\) 的形式幂级数 \(f\),令 \(\operatorname{ord}(f)\) 是最大的 \(n\) 使得 \(x^n\mid f\),那么 \(\operatorname{lcp}(S,T)=\operatorname{ord}([y^1](\mathcal I(S)-\mathcal I(T)))\)。
从而令 \(A=\mathcal I(S),B=\mathcal I(T)\),则有:
由于对于任意字符串 \(S\),\([y^0]\mathcal I(S)\) 有值的位置系数一定为 \(1\),那么可以看出:
从而可以简单得到 \(\mathrm{RHS}=\mathrm{LHS}\)。证明完毕。
Lemma 2\(\quad\)长度为 \(p,q,n\) 的字符串 \(P,Q,S\) 满足 \(f_a(P)\) 的前 \(n\) 位为 \(S\)、\(f_b(Q)\) 的前 \(n\) 位也为 \(S\)。若 \(p+q-\gcd(p,q)\le n\),则 \(f_a(P)=f_b(Q)\)。
对于限制 \(f_a(P)\) 的前 \(n\) 位为 \(S\)、\(f_b(Q)\) 的前 \(n\) 位也为 \(S\),无非就是:
考察:
令上式 \(\mathrm{RHS}\) 括号里面等于 \(F(x,y)\),那么容易发现 \(F(x,y)\) 是关于 \(x\) 的多项式且 \(\deg F(x,y)<p+q-\gcd(p,q)\)。
由于 \(\mathrm{RHS}=\mathrm{LHS}\equiv0\pmod{x^n}\),而 \(\dfrac{1-x^{\gcd(p,q)}}{(1-(1+ay)x^p)(1-(1+by)x^q)}\not\equiv0\pmod{x^n}\),从而 \(F(x,y)\equiv 0\pmod{x^n}\)。
由于 \(\deg F(x,y)<p+q-\gcd(p,q)\le n\),根据多项式推理法可以得到 \(F(x,y)=0\),进而可以简单推得 \(\dfrac{\mathcal I(P)}{1-(1+ay)x^p}=\dfrac{\mathcal I(Q)}{1-(1+by)x^q}\),这意味着 \(f_a(P)=f_b(Q)\),证明完毕。
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/18643092
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ

浙公网安备 33010602011771号