Codeforces 1276F. Asterisk Substrings (3400)
作者:互联网
给定一个全由小写字母组成的字符串 \(s\),设 \(t_i\) 表示将 \(s\) 中的第 \(i\) 个字符替换成 \(*\) 后得到的字符串,求字符串集合 \(\{s,t_1,\ldots,t_{|s|}\}\) 的本质不同的子串数量(包含空串)。
\(1\le |s|\le 10^5\)。
首先答案的构成一定是 \(\{\empty,*,s*,*s,s*t\}\) 五种形式,对于前四种,直接用 \(\text{SAM}\) 算出。
考虑第五种形式,枚举字符串 \(s\) 中哪一位被替换成 \(*\) 再计算是不可取的,因为很难去重。那么尝试枚举 \(s\),可以得到 \(s\) 的 \(\text{endpos}\) 集合。此时 \(t\) 一定是从任意一个 \(\text{endpos}+2\) 的位置开始的字符串,也就是 \(s[\text{endpos}+2:|s|]\) 的前缀。那么所有的 \(t\) 的数量就为 \(\{s[p+2:|s|]\mid p\in \text{endpos}(s)\}\) 的本质不同的前缀数量。
前缀显然不能直接做,那么考虑建立 \(s\) 的反串的 \(\text{SAM}\),此时反串的 \(\text{SAM}\) 上的某个节点 \(u\) 合法当且仅当存在至少一个 \(p\in \text{endpos}(s)\),使得表示 \(s[p+2:|s|]\) 的节点在 \(u\) 的子树内。所以合法的 \(u\) 的数量就是每个表示 \(s[p+2:|s|]\ (p\in\text{endpos}(s))\) 的节点到根的路径的并的大小。
\[|T|=\sum_{i=1}^{k} \text{dep}_{v_i}-\sum_{i=2}^{k} \text{dep}_{LCA(v_{i-1}\ ,v_i)} \]设 \(T=\{u\mid \exist p\in V,p\in \text{subtree}_{u}\}\),\(v_1,v_2\ldots v_k\) 是 \(V\) 中的元素,\(\text{dfn}_{u}\) 为 \(u\) 的 \(\text{dfs}\) 序,\(\text{dep}_u\) 为 \(u\) 的深度,$\forall i<k,\text{dfn}{v_i}<\text{dfn}{v_{i+1}}\ $,则有
标签:前缀,SAM,dep,text,Asterisk,3400,Substrings,endpos,字符串 来源: https://www.cnblogs.com/Samsara-soul/p/16364662.html