bzoj5384

题意

区间本质不同回文串个数

做法一

考虑加入右端点(i)后用线段树维护[左端点,(i)]的答案
(x)为当前点(i)的最长回文后缀,(y)(x)的最长回文后缀。令(x=S[l_1,i],y=S[l_2,i])
显然,若(xle 2|y|),则左端点(in(l_1,l_2))中不会出现(y),否则有更小周期与最长回文后缀矛盾。故(y)最近出现的位置的左端点为(l_1)
这样的话可以将(x)的所有回文后缀分成(O(log))组,分别只需要知道每组最长回文串最近一次出现的位置即可。

先把PAM建出来,用线段树动态维护PAM子树就可以知道最近一次出现的位置了

做法二

分块+PAM

分块,左端点为块右端点为(n)(sqrt n)个PAM
对于询问([l,r]),把散块([l,k))加入

直接写空间会被卡。网上找了一份代码,学了点trick
code

题外话

yy出了一种分块+manacher的做法,(O(nsqrt n)),bzoj好像现在爆炸了,等交过了再写

原文地址:https://www.cnblogs.com/Grice/p/12820295.html