[BZOJ3160] 万径人踪灭 [Manacher][FFT]

Link
BZOJ - https://www.lydsy.com/JudgeOnline/problem.php?id=3160
Luogu - https://www.luogu.org/problemnew/show/P4199


上一次写马拉车的时候甚至还没有洛谷博客
当时我还是一个挂noip的sb(虽然现在也差不多


Manacher 可以解决求 最长回文子串 的问题。
BANANA
马拉车来一步预处理
#B#A#N#A#N#A#
强行变成对处理回文串有利的奇数串。
暴力
暴力枚举回文串中心然后延伸。 O ( n 2 ) O(n^2) O(n2)
ManacherReference
按顺序扫,尽量避免做重复的工作。


本题要求:
在一个 0、1 序列中找一个不连续子序列。
满足:位置和字符都关于某条对称轴对称。
说到底就是:回文子序列减去回文子串。
回文子串马拉车即可。
回文子序列呢
仍然考虑枚举中心点
对于某个中心点 i i i
你考虑 a i − k = a i + k a_{i-k}=a_{i+k} aik=ai+k 存在多少对,如果有 j j j 对那么会产生 2 j + 1 − 1 2^{j+1}-1 2j+11 个方案惹
(减掉全都不选的那一种!!!!!!!!!!!!!!)
如果中心点是 # 那么只会产生 2 j − 1 2^j-1 2j1 个方案
但是问题来了 怎么求 j j j

你要明确一件事情 因为不是“子串” 没有了连续的限制 马拉车思想彻底废掉了 PAM也是不能的。
怎么办呢
你考虑 我们现在 并不用求出 明确的 配对
只用求出 有几个对上了
如果做过类似的题题其实你就会有相似相似的思路啦。
∑ \sum 你说好不好啊
∑ [ i − k ] ⋅ [ i + k ] \sum[i-k]\cdot[i+k] [ik][i+k]
好!
点一个卷积。
你会发现我们考虑 01 串会受到很大的阻力 因为你并不好搞 [=]
那怎么办呢
拆开啊 01串并不一定就要一起考虑
!!!
那就不讲 01 串了,下面用原文的 ‘a’ 和 ‘b’ 来讲吧。
我们把原来的字符串拆成 a a a b b b 两部分……?
A A A 串里面,在原来的字符串中是 a a a 的标 1 否则标 0
B B B 串里面,在原来的字符串中是 b b b 的标 1 否则标 0
然后就可以把它们分别自卷
卷完的两个串每一位代表以那一位为中心对称的对数
然后各种处理一下就完事了,,


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值