题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160

似乎理解加深了。

用卷积算相同的位置;先把 a 赋成1、 b 赋成0,卷积一遍;再把 a 赋成0、 b 赋成1,卷积一遍;两个加起来就有了每个位置的值,它表示以该位置/2(/2的位置可以是裂缝)为对称轴的回文位置个数。

然后用马拉车把连续区间的情况去掉。

注意一下单个元素也要算上,因为有那种奇数的;马拉车里别忘了把单个元素减去。

因为FFT的两个数组是一样的,所以FFT一次,然后自己乘自己就行了。

虽然调了很久但其实也没什么要注意的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define db double
using namespace std;
const int N=1e5+,M=N<<,mod=1e9+;
const db pi=acos(-);
int n,r[M],len,ans,bin[N];
char ch[N],tc[N<<];
struct cpl{db x,y;}a[M],b[M],I;
cpl operator+ (cpl a,cpl b){return (cpl){a.x+b.x,a.y+b.y};}
cpl operator- (cpl a,cpl b){return (cpl){a.x-b.x,a.y-b.y};}
cpl operator* (cpl a,cpl b){return (cpl){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
void upd(int &x){x>=mod?x-=mod:;x<?x+=mod:;}
void fft(cpl *a,bool fx)
{
for(int i=;i<len;i++)
if(i<r[i])swap(a[i],a[r[i]]);
for(int R=;R<=len;R<<=)//<<=1
{
int m=R>>;
cpl Wn=(cpl){ cos(pi/m),fx?-sin(pi/m):sin(pi/m) };
for(int i=;i<len;i+=R)
{
cpl w=I;
for(int j=;j<m;j++,w=w*Wn)//w=w*Wn
{
cpl tmp=w*a[i+m+j];
a[i+m+j]=a[i+j]-tmp;
a[i+j]=a[i+j]+tmp;
}
}
}
}
void manachar()
{
int m=(n<<)-;
for(int i=,j=;j<n;i+=,j++)
tc[i]=ch[j],tc[i+]=',';
int id=;
r[]=;ans--;
for(int i=;i<m;i++)
{
r[i]=;
if(id+r[id]>i)
{
r[i]=min(id+r[id]-i,r[(id<<)-i]);
}
if(id+r[id]<=i+r[i])
{
for(;i+r[i]<m&&i-r[i]>=&&tc[i+r[i]]==tc[i-r[i]];r[i]++);
r[i]--; id=i;
}
int tmp=(r[i]+(tc[i]==','))>>;//don't change r[i]!!!!!!
ans-=tmp+(tc[i]!=','); upd(ans);
}
}
int main()
{
I.x=;
scanf("%s",ch);n=strlen(ch);
bin[]=;
for(int i=,m=n+>>;i<=m;i++)bin[i]=bin[i-]<<,upd(bin[i]);
len=;
for(;len<=n<<;len<<=);
for(int i=;i<len;i++) r[i]=(r[i>>]>>)+((i&)?len>>:);
for(int i=;i<n;i++)
if(ch[i]=='a')a[i].x=;
fft(a,);
for(int i=;i<len;i++)a[i]=a[i]*a[i];
fft(a,);
for(int i=;i<n;i++)
if(ch[i]=='b')b[i].x=;
fft(b,);
for(int i=;i<len;i++)b[i]=b[i]*b[i];
fft(b,);
for(int i=;i<len;i++)//len
{
a[i].x=(int(a[i].x/len+0.5)+)>>;
b[i].x=(int(b[i].x/len+0.5)+)>>;
a[i].x+=b[i].x;
ans+=bin[(int)a[i].x]-; upd(ans);
}
manachar();
printf("%d\n",ans);
return ;
}

bzoj 3160 万径人踪灭——FFT的更多相关文章

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

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

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

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

  3. bzoj 3160 万径人踪灭 FFT

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

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 求出关于一个位置有多少对对称字母,如果 i 位置有 f[i] 对,对答案的贡献是 2^ ...

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

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

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

    [题意]给定只含'a'和'b'字符串S,求不全连续的回文子序列数.n<=10^5. [算法]FFT+回文串 [题解]不全连续的回文子序列数=回文子序列总数-回文子串数. 回文子串数可以用回文串算 ...

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

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

  8. BZOJ 3160: 万径人踪灭

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

  9. BZOJ 3160 万径人踪灭 解题报告

    这个题感觉很神呀.将 FFT 和 Manacher 有机结合在了一起. 首先我们不管那个 “不能连续” 的条件,那么我们就可以求出有多少对字母关于某一条直线对称,然后记 $T_i$ 为关于直线 $i$ ...

随机推荐

  1. Linux基本命令 权限管理命令

    1.权限管理命令chmod ================================================================================== 命令名 ...

  2. I.mx6s上移植wm8960驱动(基于linux3.0.101版本)

    I.mx6s上移植wm8960驱动   此篇博文只记录移植的步骤,其他不做分析.首先上一张wm8960的硬件连接图: 1  上电操作   配置wm8960的上电脚,文件位置:arch/arm/mach ...

  3. 【Flask】sqlalchemy 排序

    ### 排序:1. order_by:可以指定根据这个表中的某个字段进行排序,如果在前面加了一个-,代表的是降序排序.2. 在模型定义的时候指定默认排序:有些时候,不想每次在查询的时候都指定排序的方式 ...

  4. DNS 介绍

    DNS 介绍 DNS 为 Domain Name System (域名系统的缩写),它是一种将ip地址转换为对应的主机名或将主机名转换成与之对应的ip地址的一种服务机制.DNS使用TCP和UDP,端口 ...

  5. bootstrap 模态框中弹出层 input不能获得焦点且不可编辑

    bootstrap 模态框中弹出层 input不能获得焦点且不可编辑 问题描述:bs框架支持一层model层的情况下,在模态框中弹出了自定义的弹出层.发现自定义弹出层的输入框不能获得焦点且不可编辑. ...

  6. Cocos2d-x项目移植到WP8系列之五:播放MP3

    原文链接: http://www.cnblogs.com/zouzf/p/3972549.html 这一块的细节还是不太了解,只是东凑西拼能跑起来而已 1.网上下载lamb库 生成需要的lib库,详情 ...

  7. JavaWeb Request和Response

    1. Request与Response 1.1. Web应用运行机制 到目前为止,我们已经掌握了Web应用程序的运行机制,现在学习的就是Web应用程序运行机制中很重要的内容 —— Request与Re ...

  8. mongodb 中 Aggregation 的管道和分片集合( Pipeline and Sharded Collections)

    mongodb 中的aggretion 中,如果管道中存在一个与之相匹配的shard key ,那么这个管道只运行在与之相匹配的shard 中,在以前(3.2),pipeline 被分流,最后又由pr ...

  9. 开机启动顺序rc.local与chkconfig的不同

    /etc/rc.local文件有如下两行/etc/init.d/mysql start/etc/init.d/keepalived start /etc/rc.local是按脚本的顺序一个启动后启动下 ...

  10. 关于Hystrix

    RPC远程调用过程中如何防止服务雪崩效用 微服务中如何保护服务 Hystrix是一个微服务中关于服务保护框架,在分布式中能够实现对服务容错.出错之后的预备方案 背景 在今天,基于SOA的架构已经大行其 ...