题干信息解读
每头奶牛的名字是由小写字母组成的字符串,所有名字的总长度不超过 10510^{5}105 。对于每头奶牛,其 "独特性因子" 定义为仅出现在该奶牛名字中,而不出现在其他任何奶牛名字中的所有不同子串的数量。需要计算并输出每头奶牛的独特性因子。
整体做题思路
1.构建广义后缀自动机:将所有奶牛的名字合并构建一个广义后缀自动机,每个节点记录其所属的名字编号。
2.树形 DP 处理父链关系:通过 DFS 遍历后缀自动机的 fail 树,处理每个节点的父链关系,标记出只属于一个名字的节点。
3.计算独特性因子:遍历所有节点,累加那些仅属于一个名字的节点的贡献(即该节点的子串数量)。
难点和注意事项
1.广义后缀自动机的构建:需要正确处理多个字符串合并时的状态转移和克隆操作。
2.父链关系处理:在 DFS 过程中需要正确判断节点是否只属于一个名字,并处理父链传递的影响。
3.时间与空间优化:处理大规模输入时需注意内存使用和算法效率,避免 TLE 或 MLE。
AC代码(如有雷同,纯属巧合)(改编自@捏总讨厌WA)
复杂度分析
时间复杂度:构建广义后缀自动机的时间复杂度为 O(ΣL)O (ΣL)O(ΣL) ,其中 ΣLΣLΣL 是所有名字的总长度。DFS 处理 fail 树的时间复杂度为 O(nod)O (nod)O(nod) ,其中 nodnodnod 是后缀自动机的节点数,最坏情况下为 O(ΣL)O (ΣL)O(ΣL)。因此,总的时间复杂度为 O(ΣL)O (ΣL)O(ΣL)。
空间复杂度:主要用于存储后缀自动机的节点和转移边,空间复杂度为 O(ΣL)O (ΣL)O(ΣL)。