BZOJ 3160 万径人踪灭

题意:

在一个仅仅含有a,b的字符串里选取一个子序列,使得:

1.位置和字符都关于某条对称轴对称;

2.不能是连续的一段。

题解:

不连续的回文串的个数=总的回文串个数-连续回文串的个数。

后者可以用manacher在O(n)时间里面求出。求的是个数不是最长串,和之前写的几道不怎么一样,注意一下。

求总的回文串个数稍微复杂一些。我们用f[i]表示以i为对称中心,两边有多少个对称的字符。对于每个中心i我们有(2^f[i])-1种方案 答案即Σ[1<=i<=n*2+1]((2^f[i])-1)。

显然f[i]=(Σ[1<=j<=i-1]bool(str[j]==str[i-j]))+1>>1。

至于如何求出f[i],我们分别用a[]、b[]记录下每一位是否出现'a'或'b'。比如ababa这样一个数组,a={10101},b={01010}

a[]的卷积就是'a'的贡献,b[]的卷积就是'b'的贡献,两者相加+1再除以2即可。

以前什么时候写的都不知道。。重新写一遍。。

代码:

猜你喜欢

转载自www.cnblogs.com/yinwuxiao/p/8196596.html