本文给出在 询问非随机 情况下的做法。
本文的询问为“是否有长度为
l1 的回文串,有长度为
l2 的回文前缀”,与原题面有区别,请注意。
关于记号:子串
S[l,r]=SlSl+1…Sr
设
S[0,n] 为一长度为
n+1 的回文子串
设还有一个从
m 处开始、长度为
n+1 的、且与
S[0,n] 本质不同的回文子串为
S[m,m+n]
在后续,我们会证明,若
m≤4n+C1,则下一个与
S[0,n] 和
S[m,m+n] 本质不同的长度为
n+1 回文子串
S[o,o+n] 一定满足:
o>2n+C2。
C1,C2 为两个很小的常数(
由于笔者懒得推)。
换而言之,长度为
n 的本质不同子串的平均分布密度最大为
n4。对于一个长度为
N 的字符串,所有长度为
K 的本质不同字符串的个数最多为
O(KN)
对询问(是否有长度为
l1 的回文串,有长度为
l2 的回文前缀)去重后,考虑所有
l1 相同的询问。对 PAM 上所有长度为
l1 的本质不同回文子串,打上询问 tag
l2;在所有
l 打完 tag 后,在 PAM fail 树上 dfs,跑长度为
l1 的回文子串结点是否有长度
l2 的父亲。每一个询问最多贡献
O(l1N) 复杂度(由于只有
O(l1N) 个本质不同的回文子串)。
最大化时间复杂度,对
Q 个询问贪心的选
l1 最小的。由于
l1 最多只有
O(l1) 个本质不同的询问,选择所有的长度为
l1 的询问带来的贡献为
O(l1)×O(l1N)=O(N);你最多能完全选取
q=O(Q) 个
l1(
1+2+⋯+q=Q,
2q(1+q)=Q),故总时间复杂度为
O(NQ)
设
S[0,n] 为一长度为
n+1 的回文子串
设还有一个从
m 处开始、长度为
n+1 的、且与
S[0,n] 本质不同的回文子串为
S[m,m+n]
若
m≤4n+C1,则下一个与
S[0,n] 和
S[m,m+n] 本质不同的长度为
n+1 回文子串
S[o,o+n] 一定满足:
o>2n+C2
下面不加说明的,所有的
m 或
m′ 均满足
m,m′≤4n+C1
由于
S[m,m+n] 是回文串,则
S[2m,n] 一定也是回文串。
S[2m,n] 是
S[0,n] 的回文后缀,则
S[2m,n] 是
S[0,n] 的回文 Border,则
S[0,2m−1] 是
S[0,n] 的周期。该条的证明请参考
OI Wiki
这也说明,对于每一个回文串
S[m′,m′+n],对应到
S[0,n] 中一定有周期
S[0,2m′−1];若
S[0,n] 有周期
S[0,2m′−1],则
S[m′,m′+n] 才可能是回文串。
记
S[0,n] 的最小周期为
p,最小偶数周期
p′=p or 2p。
p′≤2m≤2n。设
p′=2P,则
P≤4n
根据 border 和周期的那一套性质,我们只有
S[P,P+n],S[2P,2P+n],…S[kP,kP+n] 才可能是回文串(对应有有周期
S[0,p′−1],S[0,2p′−1],…S[0,kp′−1])。其中
k 为满足
kp′=2kP≤n 的最大正整数。
kP 有
kP>2n+C2,否则
(k+1)p′≤n。
对于一个
S[k′P,k′P+n],
k′>0,在
S[k′P,n] 亦有周期
p′=2P。考虑回文中心
2n+k′P≤n,这个周期
p′ 成立的范围一定会经过回文中心。
在
S[0,n],S[P,P+n],S[2P,2P+n],…S[kP,kP+n] 之中,最多重复出现
2 个本质不同的回文串。若有
3 个以及上的本质不同回文串,则一定有两个
k 的奇偶性相同,记为
k1,k2(k1<k2),
k2=k1+2μP。由于他们在回文中心之前周期均为
2P,起始周期
S[k2P,k2P+2P−1] 为
S[k1P,k1P+2P−1] 中的某一周期中的一段,故起始周期相同,回文中心之前相同,对称过去两串也相同。
下一个出现的本质不同回文串的位置
o 一定
o>KP>2n+C2
设
N,Q 同阶,我们可以构造出这个复杂度上界的字符串和询问。
我们用字符集大小
∣∑∗∣=∞ 说明。考虑构造
N 个长度为
N 的回文字符串,使得所有回文串中中间的字符各不相同。询问
l1=[2,N],l2=[1,l1),共
O(N)∼O(Q) 个询问,每个询问对复杂度的贡献为
O(N)(
N 个长度为
l1 的本质不同回文串),总复杂度为
O(QN)∼O(NQ)。
当
∣∑∗∣=26 时,尽可能构造
N 个离中间字符最近的字符各不相同的字符串。这样可以最大化长度较小时的本质不同回文串 。由于不同回文字符串的增速是指数的,复杂度相同。