BZOJ3160:万径人踪灭(FFT,Manacher)
Solution
$ans=$回文子序列$-$回文子串的数目。
后者可以用$manacher$直接求。
前者设$f[i]$表示以$i$为中心的对称的字母对数。
那么回文子序列的数量也就是$\sum_{i=0}^{n-1}2^{f[i]-1}$
构造两个数组$a[i],b[i]$。若第$i$位为$a$,那么$a[i]=1$,否则$b[i]=1$。
可以发现$a$数组自身卷积就是$a$字母对$f$数组的贡献,$b$数组同理。
卷下$a$,卷下$b$,对应位置求和,就是$f$数组。
因为在卷积中每对对称字符被算了两次,而自己和自己关于自己对称只算了一次,所以要把答案除2向上取整。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N (400009)
#define LL long long
#define MOD (1000000007)
using namespace std; int n,fn,l,tot,r[N],len[N],p[N];
LL Re,fun;
char s[N],st[N];
double pi=acos(-1.0);
struct complex
{
double x,y;
complex (double xx=,double yy=)
{
x=xx; y=yy;
}
}a[N],b[N]; complex operator + (complex a,complex b) {return complex(a.x+b.x,a.y+b.y);}
complex operator - (complex a,complex b) {return complex(a.x-b.x,a.y-b.y);}
complex operator * (complex a,complex b) {return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
complex operator / (complex a,double b) {return complex(a.x/b,a.y/b);} void FFT(int n,complex *a,int opt)
{
for (int i=; i<n; ++i)
if (i<r[i]) swap(a[i],a[r[i]]);
for (int k=; k<n; k<<=)
{
complex wn=complex(cos(pi/k),opt*sin(pi/k));
for (int i=; i<n; i+=k<<)
{
complex w=complex(,);
for (int j=; j<k; ++j,w=w*wn)
{
complex x=a[i+j], y=w*a[i+j+k];
a[i+j]=x+y; a[i+j+k]=x-y;
}
}
}
if (opt==-) for (int i=; i<n; ++i) a[i]=a[i]/n;
} void Manacher()
{
s[++tot]='('; s[++tot]='#';
for (int i=; i<n; ++i)
s[++tot]=st[i], s[++tot]='#';
s[++tot]=')';
int maxn=,mid=,x;
for (int i=; i<=tot; ++i)
{
if (i>maxn) x=;
else x=min(maxn-i+,len[mid*-i]);
while (s[i+x]==s[i-x]) x++;
len[i]=x;
if (i+x->maxn) maxn=i+x-, mid=i;
fun=(fun+len[i]/)%MOD;
}
} int main()
{
p[]=;
for (int i=; i<=; ++i)
p[i]=p[i-]*%MOD;
scanf("%s",st); n=strlen(st);
Manacher(); fn=;
while (fn<=n+n) fn<<=, l++;
for (int i=; i<fn; ++i)
r[i]=(r[i>>]>>) | ((i&)<<(l-));
for (int i=; i<n; ++i)
if (st[i]=='a') a[i].x=;
else b[i].x=;
FFT(fn,a,); FFT(fn,b,);
for (int i=; i<fn; ++i)
a[i]=a[i]*a[i], b[i]=b[i]*b[i];
FFT(fn,a,-); FFT(fn,b,-);
for (int i=; i<fn; ++i)
{
int x=(a[i].x+b[i].x+0.5);
x=(x+)>>;
Re=(Re+p[x]-)%MOD;
}
printf("%lld\n",(Re-fun+MOD)%MOD);
}
BZOJ3160:万径人踪灭(FFT,Manacher)的更多相关文章
- BZOJ 3160: 万径人踪灭 [fft manacher]
3160: 万径人踪灭 题意:求一个序列有多少不连续的回文子序列 一开始zz了直接用\(2^{r_i}-1\) 总-回文子串 后者用manacher处理 前者,考虑回文有两种对称形式(以元素/缝隙作为 ...
- P4199 万径人踪灭 FFT + manacher
\(\color{#0066ff}{ 题目描述 }\) \(\color{#0066ff}{输入格式}\) 一行,一个只包含a,b两种字符的字符串 \(\color{#0066ff}{输出格式}\) ...
- BZOJ3160 万径人踪灭(FFT+manacher)
容易想到先统计回文串数量,这样就去掉了不连续的限制,变为统计回文序列数量. 显然以某个位置为对称轴的回文序列数量就是2其两边(包括自身)对称相等的位置数量-1.对称有啥性质?位置和相等.这不就是卷积嘛 ...
- BZOJ3160 万径人踪灭 【fft + manacher】
题解 此题略神QAQ orz po神牛 由题我们知道我们要求出: 回文子序列数 - 连续回文子串数 我们记为ans1和ans2 ans2可以用马拉车轻松解出,这里就不赘述了 问题是ans1 我们设\( ...
- BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher
BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...
- BZOJ3160 万径人踪灭 字符串 多项式 Manachar FFT
原文链接http://www.cnblogs.com/zhouzhendong/p/8810140.html 题目传送门 - BZOJ3160 题意 给你一个只含$a,b$的字符串,让你选择一个子序列 ...
- Luogu4199 万径人踪灭 FFT、Manacher
传送门 先不考虑”不是连续的一段“这一个约束条件.可以知道:第$i$位与第$j$位相同,可以对第$\frac{i+j}{2}$位置上产生$1$的贡献(如果$i+j$为奇数表明它会对一条缝产生$1$的贡 ...
- 万径人踪灭(FFT+manacher)
传送门 这题--我觉得像我这样的菜鸡选手难以想出来-- 题目要求求出一些子序列,使得其关于某个位置是对称的,而且不能是连续一段,求这样的子序列的个数.这个直接求很困难,但是我们可以先求出所有关于某个位 ...
- bzoj 3160: 万径人踪灭【FFT+manacher】
考虑正难则反,我们计算所有对称子序列个数,再减去连续的 这里减去连续的很简单,manacher即可 然后考虑总的,注意到关于一个中心对称的两点下标和相同(这样也能包含以空位为对称中心的方案),所以设f ...
随机推荐
- DBNull.Value 与null
来源:http://blog.csdn.net/beautifulsarah/article/details/54691670 DBNull.Value,, 适用于向数据库的表中插入空值.而 null ...
- 二:Jquery-action
一:dom对象和jq对象 1.对象含义: dom对象:js方法获取元素,将dom对象存储在变量中 jq对象:jq方法获取元素的jq对象,将jq对象存储在变量中 相互之间不能使用另外一个对象的任何属性和 ...
- Angular2学习笔记一
TypeScript: TypeScript变量声明:let和const是JavaScript里相对较新的变量声明方式,const是对let的一个增强,它能阻止对一个变量再次赋值. var作用域或函数 ...
- logback和slf4j的使用之logger使用
原文:https://blog.csdn.net/cw_hello1/article/details/51923814 一.logger标签描述:(了解logger标签之前先看看两个重要概念) 1.主 ...
- vue 实现父组件和子组件之间的数据双向绑定
前言:vue 实现父组件给子组件传值,然后子组件可以修改回父组件的值.vue 的 prop 默认是单向数据绑定,但是偶尔需要双向绑定,这时就需要知道如何才能让子组件的数据修改时影响到父组件的数据.转载 ...
- POJ1426(KB1-E 暴力搜索)
Find The Multiple Description Given a positive integer n, write a program to find out a nonzero mu ...
- 转-超链接a的target属性
超链接a的target属性 <a>标签的target意思很明确就是在哪里打开目标文档. 第一种情况: 默认情况:当我们没有设置超链接属性target的value值时默认是_self,即&l ...
- GIT 这么好用,为什么还是有人不知道怎么用它提交代码?
客户端代码管理工具的变迁: 从 SVN 到 GIT 截止目前,新版的 APICloud Studio 2 仍然处于公测期.APICloud Studio 2 的代码管理客户端,由 SVN 改为了 GI ...
- js中闭包和作用域
将这方面很好的一系列文章:http://www.cnblogs.com/wangfupeng1988/p/3977987.html
- 专访阿里资深研发工程师窦贤明:PG与商业数据库差距并不明显
窦贤明认为, 支持类型.功能和语法丰富,性能优良 9月24日,窦贤明将参加在北京举办的线下活动,并做主题为<Greenplum分片案例分析>的分享.值此,他分享了PG.工作上的一些经历 ...