设a[i]=bool(s[i]=='a'),b[i]=bool(s[i]=='b'),考虑a和a、b和b的卷积,由于卷积是对称的,就可以统计出不连续回文子串个数了。可能说得比较简略。再用manacher算出连续回文子串个数并减去。

#include<bits/stdc++.h>
using namespace std;
const int p=1e9+7;
const int N=1<<18;
typedef double flo;
const flo pi=acos((flo)-1);
struct vec{flo x,y;};
vec operator+(vec a,vec b){return{a.x+b.x,a.y+b.y};}
vec operator-(vec a,vec b){return{a.x-b.x,a.y-b.y};}
vec operator*(vec a,vec b){return{a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
void fft(vec*c,int n,int d){
static int f[N];
f[1]=n>>1;
for(int i=2;i<n;++i){
f[i]=f[i>>1]>>1|f[i&1];
if(i>f[i])
swap(c[i],c[f[i]]);
}
for(int i=1;i<n;i*=2){
vec w={cos(pi/i*d),sin(pi/i*d)};
for(int j=0;j<n;j+=i*2){
vec s={1};
for(int k=j;k<j+i;++k){
vec v=s*c[k+i];
c[k+i]=c[k]-v,c[k]=c[k]+v,s=s*w;
}
}
}
if(!~d)
for(int i=0;i<n;++i)
c[i].x/=n;
}
char z[N];
vec a[N],b[N];
int c[N],f[N];
int main(){
scanf("%s",z);
int n=strlen(z);
int m=4<<__lg(n);
for(int i=0;i<n;++i){
a[i].x=98-z[i];
b[i].x=z[i]-97;
}
fft(a,m,1);
fft(b,m,1);
for(int i=0;i<m;++i)
a[i]=a[i]*a[i]+b[i]*b[i];
fft(a,m,-1);
for(int i=1;i<=n;++i)
c[i]=(c[i-1]*2+1)%p;
int s=0;
for(int i=0;i<m;++i){
int j=a[i].x+.5;
(s+=c[(j+1)/2])%=p;
}
for(int i=n-1;~i;--i){
z[i*2+2]=z[i];
z[i*2+3]='#';
}
z[1]='#';
z[0]='^';
for(int i=1,j=0;z[i];++i){
int k=j+f[j];
f[i]=i<k?min(f[j*2-i],k-i):1;
if(i+f[i]>=k){
j=i;
while(z[i-f[i]]==z[i+f[i]])
++f[i];
}
(s+=p-f[i]/2)%=p;
}
printf("%d\n",s);
}

BZOJ3160: 万径人踪灭的更多相关文章

  1. [bzoj3160]万径人踪灭_FFT_Manacher

    万径人踪灭 bzoj-3160 题目大意:给定一个ab串.求所有的子序列满足:位置和字符都关于某条对称轴对称而且不连续. 注释:$1\le n\le 10^5$. 想法: 看了大爷的题解,OrzOrz ...

  2. BZOJ3160 万径人踪灭 字符串 多项式 Manachar FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8810140.html 题目传送门 - BZOJ3160 题意 给你一个只含$a,b$的字符串,让你选择一个子序列 ...

  3. BZOJ3160 万径人踪灭(FFT+manacher)

    容易想到先统计回文串数量,这样就去掉了不连续的限制,变为统计回文序列数量. 显然以某个位置为对称轴的回文序列数量就是2其两边(包括自身)对称相等的位置数量-1.对称有啥性质?位置和相等.这不就是卷积嘛 ...

  4. BZOJ3160万径人踪灭

    Description Input & Output & Sample Input & Sample Output HINT 题解: 题意即求不连续但间隔长度对称的回文串个数. ...

  5. bzoj千题计划302:bzoj3160: 万径人踪灭

    https://www.lydsy.com/JudgeOnline/problem.php?id=3160 不连续的回文串数量=所有的回文序列数量-连续的回文子串 连续的回文子串: manacher ...

  6. BZOJ3160:万径人踪灭(FFT,Manacher)

    Solution $ans=$回文子序列$-$回文子串的数目. 后者可以用$manacher$直接求. 前者设$f[i]$表示以$i$为中心的对称的字母对数. 那么回文子序列的数量也就是$\sum_{ ...

  7. BZOJ3160 万径人踪灭 【fft + manacher】

    题解 此题略神QAQ orz po神牛 由题我们知道我们要求出: 回文子序列数 - 连续回文子串数 我们记为ans1和ans2 ans2可以用马拉车轻松解出,这里就不赘述了 问题是ans1 我们设\( ...

  8. BZOJ3160: 万径人踪灭(FFT,回文自动机)

    BZOJ传送门: 解题思路: FFT在处理卷积时可以将自己与自己卷,在某一种字母上标1其他标0,做字符集次就好了. (回文就是直接对称可以联系偶函数定义理解,根据这个性质就可以将字符串反向实现字符串匹 ...

  9. 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

    原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...

随机推荐

  1. 将Microsoft Ajax Minifier集成到VS2013对JS、CSS进行编译时压缩

    在网站发布中,一般要将js,css文件压缩减少体积,以减少在HTTP请求中的流量.将Microsoft Ajax Minifier集成到VS2013中就可以对JS.CSS进行编译时压缩. VS2013 ...

  2. C++之父Bjarne Stroustrup提供的关于异常处理的建议

    节选自<The C++ Programming Language> ——C++之父Bjarne Stroustrup          1. Don’t use exceptions wh ...

  3. Bootstrap滚动监听

    滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标.其基本的实现是随着您的滚动,基于滚动条的位置向导航栏添加 .active class. <!DO ...

  4. Shell脚本编程中的几个问题

    条件语句 正确的写法: if [ $1 = "-f" ] #注意这里,前后方括号和中间的内容之间必须有空格! then commands fi 错误的写法: if [$1 == & ...

  5. [转]理解RESTful架构

    原文地址:http://www.ruanyifeng.com/blog/2011/09/restful 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件" ...

  6. android textview改变部分文字的颜色和string.xml中文字的替换(转)

    转   :http://blog.csdn.net/ljz2009y/article/details/23878669 一:TextView组件改变部分文字的颜色: TextView textView ...

  7. ActiveMQ(七)_伪集群和主从高可用使用

      一.本文目的         介绍如何在同一台虚拟机上搭建高可用的Activemq服务,集群数量包含3个Activemq,当Activemq可用数>=2时,整个集群可用.         本 ...

  8. MyEclipse去除网上复制下来的来代码带有的行号

    作为开发人员,我们经常从网上复制一些代码,有些时候复制的代码前面是带有行号,如: MyEclipse本身自带有查找替换功能,并且支持正则表达式替换,使用正则替换就可以很容易去除这些行号 使用快捷键“c ...

  9. Spring 在web 容器中的启动过程

    1.对于一个web 应用,其部署在web 容器中,web 容器提供其一个全局的上下文环境,这个上下文就是 ServletContext ,其后面的spring IoC 容器提供宿主环境 2.在web. ...

  10. 通过自定义Attribute及泛型extension封装数据验证过程

    需求来源: 在日常工作中,业务流程往往就是大量持续的数据流转.加工.展现过程,在这个过程中,不可避免的就是数据验证的工作.数据验证工作是个很枯燥的重复劳动,没有什么技术含量,需要的就是对业务流程的准确 ...