ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces 1276F. Asterisk Substrings (3400)

2022-06-10 21:01:50  阅读:171  来源: 互联网

标签:前缀 SAM dep text Asterisk 3400 Substrings endpos 字符串


给定一个全由小写字母组成的字符串 \(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=\{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}}\ $,则有

\[|T|=\sum_{i=1}^{k} \text{dep}_{v_i}-\sum_{i=2}^{k} \text{dep}_{LCA(v_{i-1}\ ,v_i)} \]

标签:前缀,SAM,dep,text,Asterisk,3400,Substrings,endpos,字符串
来源: https://www.cnblogs.com/Samsara-soul/p/16364662.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有