2025.6.25 NOI 模拟赛 题解
T1 #P1290. 多年以后 \(\quad\) CF1326F2 Wise Men (Hard Version)
题意
给定一张 \(n\) 点完全图,边权 \(0/1\),\(q\) 次询问,每次给出一个长为 \(n-1\) 的 \(0/1\) 串,求出经过每个点恰好一次且经过的边权组成的序列等于给定串的路径数量,\(n\le 18,q\le10^5\)
分析
令 \(f_s\) 表示字符串 \(s\) 的答案,令 \(g=\text{FWT}_{or}(f)\),则 \(f=\text{FWT}_{or}^{-1}(g)\),求出 \(g\) 后容易 \(O(n2^n)\) 求出 \(f\)
\(g_s\) 的意义为 \(s\) 中为 \(1\) 的位对应边权为 \(1\),其他位无限制的方案数
显然 \(s\) 中每个 \(1\) 的连续段重排后答案不变,令 \(s\) 中连续段的长度构成的可重集相同的 \(g_s\) 等价,则同一等价类中的 \(g_s\) 值相同
等价类数量等于 \(P(n)\),即 \(n\) 的 拆分数,\(n=18\) 时 \(P(n)<400\)
\(dp\) 出 \(dp_s\) 表示选择点集 \(s\) 中的点组成一条链,相邻点之间边权都是 \(1\) 的方案数,容易 \(O(n^22^n)\) \(dp\) 出
\(\text{dfs}\) 出所有可能的分拆方式,对于一组拆分 \(P_{1\sim k}\),其对应等价类中的 \(g\) 值为
令 \(t_{|s|,s}\gets dp_s\),则 \(g\) 的值可以写为 \((\prod_{i=1}^k t_{P_i})_U\),其中乘法定义为子集卷积
先对 \(t_i\) 进行 \(\text{FWT}\),\(\text{dfs}\) 拆分方式时维护目前集合幂级数之积,\(\text{dfs}\) 出具体方案后求出 \(\text{FWT}^{-1}(E)_U\) 即可,其中 \(E\) 为累乘的结果,计算 \(\text{FWT}^{-1}\) 的一项可以做到 \(O(2^n)\)
总时间复杂度 \(O(n^22^n+P(n)2^n)\)
T2 #P1291. 树回路计 \(\quad\) LOJ #6681. yww 与树上的回文串
题意
给定 \(n\) 点的树,\(0/1\) 边权,统计数对 \((x,y)\mid x<y\) 的数量满足路径 \(x-y\) 上边权按顺序组成的字符串回文,\(n\le 10^5\)
分析
考虑计算忽略 \(x<y\) 后的 \((x,y)\) 的数量 \(S\),\(\frac{S-n}2\) 即为原问题答案
点分治,令 \(p(u,v)\) 表示路径 \(u-v\) 上的边权按顺序组成的字符串,令 \(P(S)\) 表示字符串 \(S\) 是否回文,设目前处理的连通块为 \(S\),分治中心为 \(M\),删去 \(M\) 后得到的连通块集合为 \(S_M\),则需要统计
容易拆为形如给定 \(S\) 和 \(u\),求出
用 \(\{p(u,x)\mid x\in S\}\) 建立 \(\text{Trie}\),令 \(ct_u\) 表示树上结点 \(u\) 代表的字符串在 \(\{p(u,x)\mid x\in S\}\) 中的出现次数,令 \(T\) 为 \(\text{Trie}\) 的结点集合,令 \(len_u\) 表示结点 \(u\) 代表字符串的长度(之后过程都在 \(\text{Trie}\) 上,与原树无关),令 \(str(u)\) 表示结点 \(u\) 代表的字符串(从根到 \(u\)),令 \(rstr(u)\) 表示 \(str(u)\) 的逆序
转化为计算
转化为计算
对于 \(len_u>len_v\),\(P(rstr(u)+str(v))\) 成立当且仅当 \(str(u)\) 长为 \(len_v\) 的后缀与 \(str(v)\) 相等,且其长为 \(len_u-len_v\) 的前缀回文
一个字符串 \(S\) 的回文前缀可以划分为 \(O(\log S)\) 个不交的等差数列,考虑对于每个 \(u\) 预处理 \(b_u=\{(d,l,r)\}\),表示 \(str(u)\) 长度为 \(l,l+d,l+2d,\cdots,r\) 的前缀回文
\(b_u\) 容易由 \(\text{Trie}\) 上 \(u\) 的父亲的 \(b\) 配合哈希得到,这部分时间复杂度 \(O(|T|\log|T|)\)
对 \(\text{Trie}\) 建立 \(\text{AC}\) 自动机,则 \(str(u)\) 长为 \(len_v\) 的后缀与 \(str(v)\) 相等等价于 \(str(v)\) 为 \(str(u)\) 的 \(\text{border}\),等价于 \(fail\) 树上 \(u\) 在子树 \(v\) 中
问题转化为求
考虑对 \(d\) 分治,设阈值为 \(S\)
当 \(d>S\) 时,在 \(fail\) 树上 \(\text{dfs}\) 的过程中,设目前 \(\text{dfs}\) 到 \(u\),维护 \(s_d\) 表示 \(u\) 到的点到根的路径上 \(len=d\) 的点的 \(ct\) 和,枚举 \((d,l,r)\mid d>S\),暴力枚举 \(t=l+kd\mid 0\le k\le\frac{r-l}k\) 并将 \(ct_us_{len_u-t}\) 计入答案,这部分时间复杂度 \(O\left(\frac{|T|^2}S+|T|\log|T|\right)\)
当 \(d>S\) 时,令 \(fd(u,k)\) 表示 \(u\) 到根的路径上第一个 \(len\le k\) 的点(容易用倍增做到单次 \(O(\log|T|)\))
枚举 \(u\),枚举每一组 \((d,l,r)\mid d\le S\),拆为 \(fd(u,len_u-l)\) 和 \(fd(u,len_u-r-1)\) 相减,每个点 \(u\) 上保存若干 \((v,d,l)\) 表示对答案的贡献为 \(u\) 到 \(1\) 的路径上 \(len\bmod d=l\) 的点的 \(ct\) 之和乘以 \(v\)
在 \(\text{dfs}\) 过程中维护 \(w_{d,r}\) 表示当前点到根的路径上 \(len\bmod d=r\) 的点的 \(ct\) 之和
这部分时间复杂度 \(O(|T|S+|T|\log^2|T|)\)
取 \(S=O(\sqrt{|T|})\)(实际由于前一部分常数较小,\(S\) 可以略取小一点),处理一个大小为 \(|T|\) 的连通块的时间复杂度为 \(O(|T|\sqrt{|T|}+|T|\log^2|T|)\)
总时间复杂度 \(O(n\sqrt n+n\log^3 n)\)
T3 #P1292. 基因(gene) \(\quad\) QOJ # 8592. Toxic Gene 2
比赛结果
\(68+25+23\),\(\text{rk}10\)

浙公网安备 33010602011771号