【题解】Asterisk Substrings Codeforces 1276F 后缀自动机 树链的并
第一道独立解决的 Div1F ,嘿嘿,幸好没看题解 把串分为以下几类 不包含 star 的串 太简单,略 star 在最前面的串 略 star 在最后面的串 略 单独一个 star 答案 ++ 单独一个空串 答案 ++ star 在中间的串 注意到,假设 star 的位置是 pos ,实际上相当于选择一个右端点为 pos-1 的串 s1 ,再选择一个左端点为 pos+1 的串 s2 ,问这样的 pair(s1,s2) 有多少个 也就是选两个原串的子串,并且这两个子串要满足上面那个条件,问方案数 对原串的 前 n-2 个字符 建 SAM ,称为 sam 对原串的 后 n-2 个字符倒过来 再建 SAM ,称为 rsam 注意到, SAM 上每个点表示的本质不同子串数量是 len[u] - len[pa[u]] ,其中 len 是点 u 所表示字符串的最长长度, pa 是点 u 在后缀树上的父亲,记这个值为 val[u] 也就是说,问题变成了:枚举 sam 里面的一个点 u ,枚举 rsam 里面的一个点 v ,如果 v 的 end_pos 集合存在一个数字,等于 u 的 end_pos 集合里面的某个数字 +2 ,那么 ans += val[u] * val[v] 考虑 sam 里面的每个点 u ,假设 u 的 end_pos 集合是 {a1, a2, a3, ..., ak}