题目
分类讨论六种排列:
A B C : ABC: ABC:一次哈希判断。
C A B : CAB: CAB:枚举 C C C的长度,总共 n n n次哈希判断。
B C A : BCA: BCA:枚举 A A A的长度,总共 n n n次哈希判断。
C B A : CBA: CBA:构造新串 P = s 1 t n s 2 t n − 1 . . . s n t 1 P = s_1t_ns_2t_{n-1}...s_nt_1 P=s1tns2tn−1...snt1
那么问题转化为将 P P P划分为 3 3 3个偶回文串。
枚举第一个回文串的位置 [ 1....2 x ] [1....2x] [1....2x],那么就相当于判断 [ 2 x + 1...2 n ] [2x+1...2n] [2x+1...2n]是否是双偶回文串,也就是判断它是否能分成两个偶回文串。
这个是在《字符串算法选讲 金策》中的经典问题:
它的意思是对于任意一个可以是双回文串的串,对于一种双回文划分 y 1 + y 2 = s y_1+y_2 = s y1+y2=s,只要有一个回文前缀的长度 > y 1 > y_1 >y1(上面的证明显然需要 ∣ v ∣ > 0 |v| > 0 ∣v∣>0),那么对于所有长度 ≥ y 2 \geq y_2 ≥y2的回文后缀, s s s去掉它之后的串(是 s s