5.1总结

开场就开始猛干A
然后想了一下发现可以容斥
容斥后就变为了计算公共子串方案数。
每种本质不同子串只有最左边的和最右边的有用。
然后就是区间加等差数列,用线段树做。
由于好久没写sam了,调了很久才过了样例。
结果交上去被卡成暴力分了。
这是因为没有对拍,没有测极限数据

题解:
A
好久都没碰过字符串了
考虑容斥,用([1,i])本质不同字符串+([i+1,n])本质不同字符串-同时出现在([1,i][i+1,n])中的本质不同字符串。
求前,后缀本质不同字符串数是经典问题(SDOI2016生成魔咒),用sam解决,每次加上后缀点的len-后缀点父亲的len。
同时出现在([1,i][i+1,n])中的本质不同字符串,可以枚举每一种本质不同字符串考虑它的贡献。
如果它对(i)分割点有贡献,则必须有一个该字符串的右端点在(i)左边,必须有一个必须有一个该字符串的左端点在(i)右边。
它的出现位置显然是一个区间。
显然只有最左,最右的出现位置有用,可以在sam上dfs求出最左,最右出现右端点
这等价于枚举sam上的每个节点,每个节点代表串上的一类出现右端点相同的子串。
它对答案的贡献是区间加一次函数。
这显然可以用线段树维护,维护区间一次函数斜率,截距即可。
时间复杂度(O(nlog_2n))

原文地址:https://www.cnblogs.com/ctmlpfs/p/14724241.html