显而易见的,回文串最多只有一个字符出现次数是奇数。
奇偶性我们可以简单地用 0/10/10/1 代替。所以,我们有 262626 个字母,每个字母有 0/10/10/1 两种状态。所以我们可以使用状态压缩!(题目1024MB也是一种提醒)
所以,dpmaskdp_{mask}dpmask 表示当目前前缀状态为 maskmaskmask 的时候的合法子串数量(目前,是指目前处理到了哪一位)。
首先记录一下目前的前缀 ppp,然后将答案加上 dppdp_pdpp 。
同时,我们知道,有可能会有一个字母出现奇数次。枚举这个字母,并记录答案。
最后,记得用 ppp 更新 dppdp_pdpp 的值。
注意下,一开始 dp0=1dp_0=1dp0 =1,因为任何字母都出现 000 次。
时间复杂度:O(n)O(n)O(n)
空间复杂度:O(n+226)O(n+2^{26})O(n+226)
Code: