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好像现在爆炸了,等交过了再写

posted @ 2020-05-04 15:06  Grice  阅读(270)  评论(0编辑  收藏  举报