【5.5 清北笔记】

1

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

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

2

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

3

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

4

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

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

mid>x:sum+=x>y:sum+==y>n:sum+==min[l,mid]max[l,mid]i=mid+1x1(il+1)max[l,mid]i=xy1(il+1)min[mid+1,i]max[l,mid]i=xy1imin[i](l1)min[i]i=ynmin[mid+1,i]max[mid+1,i](il+1)i=ynmin[mid+1,i]max[mid+1,i]imin[mid+1,i]max[mid+1,i](l1) 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是单调的。
维护一堆前缀和就可以做了。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值