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}
ai−k=ai+k 存在多少对,如果有
j
j
j 对那么会产生
2
j
+
1
−
1
2^{j+1}-1
2j+1−1 个方案惹
(减掉全都不选的那一种!!!!!!!!!!!!!!)
如果中心点是 #
那么只会产生
2
j
−
1
2^j-1
2j−1 个方案
但是问题来了 怎么求
j
j
j
?
你要明确一件事情 因为不是“子串” 没有了连续的限制 马拉车思想彻底废掉了 PAM也是不能的。
怎么办呢
你考虑 我们现在 并不用求出 明确的 配对
只用求出 有几个对上了
如果做过类似的题题其实你就会有相似相似的思路啦。
∑
\sum
∑ 你说好不好啊
∑
[
i
−
k
]
⋅
[
i
+
k
]
\sum[i-k]\cdot[i+k]
∑[i−k]⋅[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
然后就可以把它们分别自卷
卷完的两个串每一位代表以那一位为中心对称的对数
然后各种处理一下就完事了,,