【BZOJ】3160: 万径人踪灭 FFT+回文串

本文介绍了一种利用FFT及回文串算法高效计算给定字符串中不全连续的回文子序列数量的方法。该方法首先计算回文子序列总数,然后减去回文子串的数量得到最终结果。

【题意】给定只含'a'和'b'字符串S,求不全连续的回文子序列数。n<=10^5。

【算法】FFT+回文串

【题解】不全连续的回文子序列数=回文子序列总数-回文子串数。

回文子串数可以用回文串算法(Manacher,PAM,二分+hash)轻松计算。

设f[i]表示以i为对称中心的对称字符对数,那么 i 对答案的贡献是$2^{f[i]}-1$,同时容易列出f[i]的计算公式:

$$f[i]=\sum_{j=0}^{i}[S_j=S_{2i-j}]$$

令a=0,b=1,那么有:

$$f[i]=\sum_{j=0}^{i}S_j*S_{2i-j}$$

这是一个卷积的形式,将上届扩展到2*i就可以计算了,同理计算a=1,b=0。

同理计算以i和i+1中间为对称中心的答案。

也可以用manacher那种方式处理字符串。

 

转载于:https://www.cnblogs.com/onioncyc/p/8870257.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值