【5.5 清北笔记】

1

给定m个01串,求有多少长度为n的01回文串,使得不存在两个不重叠的子串是这m个串中的两个。

建立两颗ac自动机。
考虑不合法的情况。
左边两个串,右边两个串,左一个右一个,和有一个跨过中间的串。
把m个串正着建一棵ac自动机,反着建一棵ac自动机。
f[i][j][k][0/1][0/1]表示已经填了i位,左边自动机走到j右边走到k的方案数。
枚举字符就是在两个自动机上同时匹配的过程。
匹配到了一个串就返回到根。
那么不跨过中间的串就可以解决了。
考虑跨过中间的串。
预处理出第一个自动机的每个节点和第二个自动机的每个节点能否拼出一个子串。

2

提交答案题…
先看数据,
相邻的几个点有相似的性质。
模拟退火 ( e x p ( ( c 1 c 2 ) / T ) )

3

把点排序,从大到小加入森林里
他是森林里最小的点
每个点出发走到最远的点是树的直径

4

求和:区间长度 * 区间最大值 * 区间最小值(bzoj 3745)

cdq分治?
先处理左区间的答案,再处理右区间的答案,再处理跨过中点的区间的答案。
但是跨过中点的区间涉及三个信息不好处理。
考虑枚举左端点,那么从左端点到中点的数都一定在这个区间里。也就是说,对于任意一个在[mid+1,r]之间的右端点,最小值一定不小于[i,mid]的最小值,最大值同理。
中点右侧,有两个特殊点把右边分成三部分 : 最小值变小的点,最大值变大的点。
三部分分别计算答案。
展开搞一搞:

m i d > x : s u m + = m i n [ l , m i d ] m a x [ l , m i d ] i = m i d + 1 x 1 ( i l + 1 ) x > y : s u m + = m a x [ l , m i d ] i = x y 1 ( i l + 1 ) m i n [ m i d + 1 , i ] = m a x [ l , m i d ] i = x y 1 i m i n [ i ] ( l 1 ) m i n [ i ] y > n : s u m + = i = y n m i n [ m i d + 1 , i ] m a x [ m i d + 1 , i ] ( i l + 1 ) = i = y n m i n [ m i d + 1 , i ] m a x [ m i d + 1 , i ] i m i n [ m i d + 1 , i ] m a x [ m i d + 1 , i ] ( l 1 )

l向左移动的时候x,y是单调的。
维护一堆前缀和就可以做了。

猜你喜欢

转载自blog.csdn.net/dt_kang/article/details/80224216
5.5
今日推荐