BZOJ3160 - 万径人踪灭

BZOJ3160 - Click Here

  

Description

Input&Output

Solution

  从对称轴入手还是挺好想的啊>_<。

  

  题目要求所有不连续对称回文子序列。那我们就求出所有对称回文子序列,然后减去连续的情况。连续的情况可以跑一次Manacher求出。

  

  现在问题转换成如何求回文子序列。

  我们考虑一条对称轴$x=0.5k,\, k \in N \cap [0,2(n-1)]$,以$x$为对称轴能产生许多回文子序列。

  不难发现,回文子序列满足下列性质:对于每个回文子序列中的字符$s_i​$,必定存在$j​$,使得$s_i=s_j,\, i+j=2x​$。而且$s_j​$也一定在回文子序列上。因此每个回文子序列是由多个$(i,j)​$二元组组成的,且二元组满足$s_i=s_j, \, i + j = 2x​$。

  换言之,如果定义$f(2x)$表示以$x$为对称轴时,满足$s_i=s_j, \, i+j=2x$的二元组$(i,j)$个数,那么这条对称轴对答案的贡献为$2^{f(2x)}-1$。

  

  现在想想怎么求$f(x)$。

  根据$f(x)$的定义,可得$f(x)=\sum_{i+j=x}[s_i==s_j]=\sum_{i=0}^{x}[s_i==s_{x-i}]$

  看着像卷积?然而不会解。。。

  

  我们可以换个思路,由于字符串中只有$a$和$b$,因此可以分别考虑$a$和$b$对对称轴$x$的贡献。

  由于$a$和$b$的问题是一样的,不妨只考虑$a$。

  对对称轴产生贡献的前提是$s_i==s_j$和$i+j=2x$,由于限定了$a$,因此条件一满足。现在就是求解有多少个二元组$(i,j)$满足$i+j=2x$。

  就是说,有很多个下标,要求选择2个,使得和为$2x$。这个不就是生成函数的常见例题吗。。。

  因此构造出生成函数,然后FFT加速就可以解决啦。

  

CODE

CODE - Click Here

本站总访问量次 | 本站访客数人次

Powered by Hexo | Designed by iTimeTraveler | Refined by CSHwang