[HAOI2016]找相同字符
一、题目 点此看题 二、解法 一般这种题都是在第一个字符串上建后缀自动机,然后第二个去乱搞。 我们先处理出每个节点的 r i g h t right r i g h t 集合大小 s i z siz s i z ,然后把第二个串丢进去匹配,设匹配到的点为 p p p ,长度为 l e n len l e n ,则匹配到这个点的贡献为: ( l e n − l e n [ f a [ p ] ] ) × s i z [ p ] (len-len[fa[p]])\times siz[p] ( l e n − l e n [ f a [ p ] ] ) × s i z [ p ] 匹配完之后还要以自动机上的节点再算一遍贡献(因为匹配时我们只算了下面的,没有算上面的),我们再匹配时对 p p p 点打标记,设 s u m [ i ] sum[i] s u m [ i ] 为 i i i 子树内的标记个数(不包含 i i i ),那么这个点的贡献为: s u m [ i ] × ( l e n [ i ] − l e n [ f a [ i ] ] ) × s i z [ i ] sum[i]\times(len[i]-len[fa[i]])\times siz[i] s u m [ i ] × ( l e n [ i ] − l e n [ f a [ i ] ] ) × s i z [