思路:

这道题思路好奇怪…….

我们先要知道关于x (x可以是间隙) 对称的有几对字母

显然暴力是n^2的

那怎么办呢

先把所有’a’看成1 ‘b’看成0

意外的发现 这不就是卷积嘛

再倒过来搞一搞

加一下

2^x-1就是包含连续的回文串的解了

然后 跑个manacher 把包含的删掉就好啦

时间复杂度是O(nlogn)的

代码:

//By SiriusRen
#include <cstdio>
#include <complex>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef complex<double> cplxd;
const int N=270050,mod=1000000007;const double pi=acos(-1);
int n,nn,L,R[N],p[N],id,mx,ans;
char ch[N];
cplxd a[N],b[N];
void FFT(cplxd *a,int f){
for(int i=0;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);
for(int i=1;i<n;i<<=1){
cplxd wn(cos(pi/i),f*sin(pi/i));
for(int j=0;j<n;j+=(i<<1)){
cplxd w(1,0);
for(int k=0;k<i;k++,w*=wn){
cplxd x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y,a[j+k+i]=x-y;
}
}
}
if(!~f)for(int i=0;i<n;i++)a[i]/=n;
}
int pow(ll x){
ll res=1,tmp=2;
for(;x;x>>=1,tmp=(tmp*tmp)%mod)if(x&1)res=(res*tmp)%mod;
return res;
}
int main(){
scanf("%s",ch+1);
n=strlen(ch+1),nn=n*2+2;
for(int i=1;i<=n;i++)if(ch[i]=='a')a[i]=1;else b[i]=1;
for(int i=n;i;i--)ch[i*2]=ch[i],ch[i*2-1]='#';
ch[0]='&',ch[n*2+1]='#',ch[n*2+2]='$';
for(n=1;n<=nn;n<<=1)L++;
for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
FFT(a,1);for(int i=0;i<n;i++)a[i]*=a[i];FFT(a,-1);
FFT(b,1);for(int i=0;i<n;i++)b[i]*=b[i];FFT(b,-1);
for(int i=0;i<n;i++)a[i]+=b[i];
for(int i=1;i<=nn;i++){
if(mx>i)p[i]=min(p[id*2-i],p[id]+id-i);
else p[i]=1;
while(ch[i-p[i]]==ch[i+p[i]])p[i]++;
if(i+p[i]>mx)mx=i+p[i],id=i;
}
for(int i=1;i<=nn;i++,ans%=mod)ans-=(p[i]-(i&1))/2;
for(int i=0;i<n;i++)ans=(ans+pow((ll(a[i].real()+1.1))/2)-1)%mod;
printf("%d\n",ans);
}

BZOJ 3160 FFT+Manacher的更多相关文章

  1. BZOJ 3160 FFT+马拉车

    题意显然 ans=回文子序列数目 - 回文子串数目 回文子串直接用马拉车跑出来 回文子序列一开始总是不知道怎么求 (太蠢了) 后面看了题解 构造一个神奇的卷积 (这个是我盗的图)地址 后面还有一些细节 ...

  2. BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher

    BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...

  3. BZOJ 3160: 万径人踪灭

    Description 一个ab串,问有多少回文子序列,字母和位置都对称,并且不连续. Sol FFT+Manacher. 不连续只需要减去连续的就可以了,连续的可以直接Manacher算出来. 其他 ...

  4. BZOJ 3160: 万径人踪灭 [fft manacher]

    3160: 万径人踪灭 题意:求一个序列有多少不连续的回文子序列 一开始zz了直接用\(2^{r_i}-1\) 总-回文子串 后者用manacher处理 前者,考虑回文有两种对称形式(以元素/缝隙作为 ...

  5. bzoj 3160: 万径人踪灭【FFT+manacher】

    考虑正难则反,我们计算所有对称子序列个数,再减去连续的 这里减去连续的很简单,manacher即可 然后考虑总的,注意到关于一个中心对称的两点下标和相同(这样也能包含以空位为对称中心的方案),所以设f ...

  6. bzoj 3160: 万径人踪灭 manachar + FFT

    3160: 万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 133  Solved: 80[Submit][Status][Discuss] ...

  7. 【BZOJ 3160】 3160: 万径人踪灭 (FFT)

    3160: 万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1440  Solved: 799 Description Input Outp ...

  8. bzoj 3160 万径人踪灭——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 似乎理解加深了. 用卷积算相同的位置:先把 a 赋成1. b 赋成0,卷积一遍:再把 ...

  9. bzoj 3160 万径人踪灭 FFT

    万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1936  Solved: 1076[Submit][Status][Discuss] De ...

随机推荐

  1. SQL语句之Insert

    插入常见的3种形式: 单条插入, 批量插入, 返回刚插入行的id http://www.cnblogs.com/yezhenhan/archive/2011/08/17/2142948.html

  2. 在js在添版本号

    为了增加用户访问网站体验,快速打开网页,许多网站都对不常更新的js,css文件在浏览器端设置了缓存.但如果在服务器端做了更新,浏览器使用的仍是缓存在本地的js文件,除非强制清缓存(ctrl+F5).为 ...

  3. nginx 与 Windows 错误

    设置根目录 root "D:/www/app"; proxy_pass 反向代理 404 location php 模块添加 fastcgi_split_path_info ^(( ...

  4. surfaceView实现拍照功能

    1.布局中只有一个SurfaceView和Button,初始SurfaceView通过surface.getHolder获得SurfaceHolder类 SurfaceView sfv= (Surfa ...

  5. spring的JdbcTemplate

    一.首先配置JdbcTemplate: 要使用Jdbctemplate 对象来完成jdbc 操作.通常情况下,有三种种方式得到JdbcTemplate 对象.       第一种方式:我们可以在自己定 ...

  6. 趣学算法 PDF pdf 下载 陈小玉版

    趣学算法pdf高清无水印版下载 最近在网上找趣学算法pdf,最后还是买了完整版,今天将本书分享出来,分享给那些和我一样在网上苦苦寻找的小可爱们,有条件的话请支持正版! 链接:https://pan.b ...

  7. LVS负载均衡三种模式的实现

    何为lvs负载均衡? lvs负载均衡(linux virtual server)又名linux虚拟服务器.由章文嵩博士主导的负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在Linux ...

  8. Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案

    Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案 解决方式:安装 "babel-polyfill" 即可. 命令:npm install --save-dev ...

  9. 2.安装Cython

    许多科学的Python发行版,例如Anaconda,Enthought Canopy和Sage,捆绑Cython并且不需要设置. 与大多数Python软件不同,Cython需要在系统上存在C编译器.获 ...

  10. JVM运行原理详解

    1.JVM简析:      作为一名Java使用者,掌握JVM的体系结构也是很有必要的.      说起Java,我们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Ja ...