M-Mediocre String Problem
给定字符串S,T,求S的子串与T的前缀子串能够组成的回文串个数
题意
给定两个字符串$s ,t$,取$s$的子串$s’$和$t$的前缀子串$t’$,并使$|s’|>|t’|$.拼接$s’,t’$得到$str=s’+t’$,求能使$str$为回文串的总方案数。
思路
由于$|s’|>|t’|$,可令$s’=a+b,t’=c ,(|a|=|c|>0,|b|>0)$
因此$str=a+b+c$,由回文串性质可知,$b$为长度大于0的回文串,且$reverse(a)=c$
如,对于字符串$s=aabbcdedc,t=bbaa$,以$x=4$为例
$aabb|cdedc$
$aabb$
$;;abb$
$;;;;bb$
$;;;;;b$
$a,c$有以上4种取法,$b=c或b=cdedc$,共有2×4=8种情况
解法
对于$1≤i≤|s|$求出以$s$以第$i$位开头的回文串个数$CNT(i)$,可以采用Manacher,利用回文串性质差分求解;
翻转$s$,利用ex-KMP求解$reverse(s)$的后缀与$t$的最长公共前缀$LCP$;
对于原串$s$的第$x$位,能够组成的回文串个数为$LCP(x)·CNT(x+1)$,求和即为所求解.
代码
1 |
|