bzoj5384
题意
区间本质不同回文串个数
做法一
考虑加入右端点\(i\)后用线段树维护[左端点,\(i\)]的答案
令\(x\)为当前点\(i\)的最长回文后缀,\(y\)为\(x\)的最长回文后缀。令\(x=S[l_1,i],y=S[l_2,i]\)
显然,若\(x\le 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(n\sqrt n)\),bzoj好像现在爆炸了,等交过了再写