CF1393E2 - Twilight and Ancient Scroll (Harder Version)
CF1393E2 - Twilight and Ancient Scroll (harder version)
题目大意
给定个串,求在每个串中至多删除一个字符(可以删到空)
最终字典序单调不减的方案数
dp
显然是记录上一个串删除的位置,得到,依次考虑每个串
设为当前串,为上一个串
每次我们枚举当前串删除的位置,不妨设得到的新串为,考虑对于找到所有合法转移
设,在中删除位置为
1.
则可以根据和的关系确定与的关系,只需要处理一个后缀和
2.设为向前延伸且字符相同的最长位置,
此时,删除可能会使得,所以提出来特殊处理
显然,那么对于得到的新串可以再求来判断大小
只需要一个区间和
3.,此时
由于,比较相当于比较
其中表示在开始的后缀,那么预处理找到所有合法的,累前缀和即可得到
关于实现
写就完蛋了
由于删除一个字符之后,求的两个串就是在原串基础上进行的偏移
线性预处理三个数组即可,当然真正求的时候需要分类讨论一下(真的,就一下/md)
判断容易倒着线性预处理出来,在代码里是
所有操作均可以线性处理,时间复杂度为,77ms
Tips:
比较过程中容易出现奇妙的越界,我写得很丑
1 | const int N=1e6+10,P=1e9+7; |