【模拟赛】蒙古上丹(回文串,线段树)

题面

iuR nehC不仅是小破站之神、量子力学之神,还是游戏之神。

对于一个字符串 T T T,定义一次行走为你选择一个任意长度(不妨设长度为 m m m) 的正整数序列 t 1 , t 2 , . . . , t m t_1, t_2, . . . , t_m t1​,t2​,...,tm​,其中 ∀ i ∈ [ 1 , m ] , t i ∈ [ 1 , ∣ T ∣ ] ∀i ∈ [1, m], t_i ∈ [1, |T|] ∀i∈[1,m],ti​∈[1,∣T∣]、 ∀ i ∈ [ 2 , m ] , ∣ t i − t i − 1 ∣ = 1 ∀i ∈ [2, m], |t_i − t_{i−1}| = 1 ∀i∈[2,m],∣ti​−ti−1​∣=1、 t 1 ≠ t m t_1\not= t_m t1​​=tm​ 并且 T t 1 T t 2 . . . T t m T_{t_1} T_{t_2} . . . T_{t_m} Tt1​​Tt2​​...Ttm​​ 是一个回文串,在这次行走后我们认为了你经过了 t 1 , t 2 , . . . , t m t_1, t_2, . . . , t_m t1​,t2​,...,tm​ 这些位置各一次。

称一个字符串是“叔叔喜欢”的,当且仅当你可以通过若干次行走使得这个字符串的每个位置都被经过至少一次

现在给定一个长度为 n n n 的字符串 S S S,有 q q q 次询问,第 i i i 次询问给出两个数 l i , r i l_i , r_i li​,ri​, 你需要判断 S S S 中 l i l_i li​ 到 r i r_i ri​ 的这个子串是否是“叔叔喜欢”的。

1 ≤ n , q ≤ 1 0 6 , 1 ≤ l i ≤ r i ≤ n 1\leq n,q\leq10^{6},1\leq l_i\leq r_i\leq n 1≤n,q≤106,1≤li​≤ri​≤n 。

题解

首先我们会发现有一种很简单的方法是可以经过整个字符串的:

找到连续的三个位置 i − 1 , i , i + 1 i-1,i,i+1 i−1,i,i+1 ,满足 S i − 1 = S i + 1 S_{i-1}=S_{i+1} Si−1​=Si+1​ ,那么我们可以从 i − 1 i-1 i−1 开始,走到 i i i ,再往左走到底、走回来,再走到 i + 1 i+1 i+1 。第二遍往右,同样的方法。

同时我们也可以证明,合法的奇数长度的行走是一定存在这样的位置的:

对于一个奇数长度的行走,从起点和终点同时开始,往中间进行,总会存在第一个相遇的位置 i i i ,由于起点终点不相同,所以 i i i 一定是从 i − 1 i-1 i−1 和 i + 1 i+1 i+1 两个方向过来的。此时 S i − 1 S_{i-1} Si−1​ 和 S i + 1 S_{i+1} Si+1​ 一定相等。

既然充分性必要性都证了,那么奇数长度的行走就被吃透了。接下来考虑偶数长度的行走,由于上述的强大结论,我们不妨设不存在这样的无敌位置,再来考虑偶数行走。

对于一次合法的偶数长度行走,我们从该回文串的中间两个位置开始同时往起点和终点走,不难发现两个点不可能相遇。如果某个时刻出现两个点往同一方向走,那么便会存在无敌位置,与假设不成立。因此每时每刻只能往不同方向走。这就意味着:整个行走的最简部分形成原串的一个偶数长度回文子串

那么,在这样的假设下,区间是“叔叔喜欢”的充要条件就是:每一个位置都被回文子串包含。

我们用 Manacher 算法算出每个位置的最长回文子串,然后加入线段树中,预处理出每个位置 i i i ,左边最近的位置 l i l_i li​、右边最近的位置 r i r_i ri​ ,满足 S [ l i . . . i ] , S [ i . . . r i ] S[l_i...i],S[i...r_i] S[li​...i],S[i...ri​] 为回文串。

不难发现,若一个询问 [ L , R ] [L,R] [L,R] 满足 ∃ i ∈ [ L , R ] , [ L , R ] ⊆ ( l i , r i ) \exist i\in [L,R],[L,R]\sube(l_i,r_i) ∃i∈[L,R],[L,R]⊆(li​,ri​) ,且不存在无敌位置,那么就输出 0,且这个条件是充要的。

把询问离线下来,最后用扫描线添加区间,左端点 ∈ ( l i , i ] \in(l_i,i] ∈(li​,i] 时,对 [ i , r i ) [i,r_i) [i,ri​) 区间进行标记,若右端点落在标记区间中,则只有无敌位置可以拯救它。

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn) 。

CODE


上一篇:Ybtoj #891. 「高斯消元」生日礼物


下一篇:P3232 [HNOI2013]游走