题意
区间本质不同回文串个数
做法一
考虑加入右端点(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好像现在爆炸了,等交过了再写