【BZOJ 3160】 3160: 万径人踪灭 (FFT)
3160: 万径人踪灭
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 1440 Solved: 799Description
Input
Output
Sample Input
Sample Output
HINT
Source
【分析】
看题目被吓死,其实很多废话。。
还是自己想出来了。。FFT好强啊。。可以加速很多东西的说。
然后就是,枚举对称轴吧?
假设a[i]==a[j],那么用i+j表示它的对称轴。
共有0~2*n的对称轴,对于每个对称轴它的对称点对个数就是$F[k]=\sum s[k-i]==s[k+i]$
注意到只有a和b,假设只考虑a相同,令$a[i]=s[i]=='a'?1:0$
那么就是$F[k]=\sum a[k-i]*a[k+i]$
化成卷积形式,可以用FFT做了。用b也做一遍
最后答案是$\sum 2^{F[k]}$-空串-回文子串(不能连续嘛)
回文子串我用马拉车打了,,,然后打错了,,,然后TLE了,,,以为是FFT的递归版太慢,还去学了迭代打法【醉生梦死。。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 100010*8
#define Mod 1000000007
#define LL long long
const double pi=acos(-); int mymin(int x,int y) {return x<y?x:y;} struct P
{
double x,y;
P() {x=y=;}
P(double x,double y):x(x),y(y){}
friend P operator + (P x,P y) {return P(x.x+y.x,x.y+y.y);}
friend P operator - (P x,P y) {return P(x.x-y.x,x.y-y.y);}
friend P operator * (P x,P y) {return P(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x);}
}a[Maxn];
int i,j,k; int nn=,R[Maxn];
void fft(P *a,int f)
{
for(i=;i<nn;i++) if(i<R[i]) swap(a[i],a[R[i]]);
for(i=;i<nn;i<<=)
{
P wn(cos(pi/i),f*sin(pi/i));
for(int ad=i<<,j=;j<nn;j+=ad)
{
P w(,);
for(k=;k<i;k++,w=w*wn)
{
P x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y;a[j+k+i]=x-y;
}
}
}
} char s[Maxn];
int ans[Maxn]; int aa[Maxn],pp[Maxn];
int get_manacher(int ll)
{
int mx=,id=;
for(int i=;i<=ll;i++)
{
int k;
if(i<mx) k=mymin(pp[*id-i],mx-i+);
else k=;
while(aa[i+k]==aa[i-k]&&i-k>=&&i+k<=ll) k++;
pp[i]=k;
if(i+pp[i]->mx) mx=i+pp[i]-,id=i;
}
int as=;
for(int i=;i<=ll;i+=) as=(as+(pp[i]+)/)%Mod;
for(int i=;i<=ll;i+=) as=(as+pp[i]/)%Mod;
return as;
} int bin[Maxn]; int main()
{
scanf("%s",s);
int n=strlen(s);n--;
for(i=;i<=n;i++) a[i].x=(s[i]=='a'?:); int ll=;nn=;
while(nn<=n+n) ll++,nn<<=;
for(i=;i<nn;i++) R[i]=(R[i>>]>>)|((i&)<<(ll-)); fft(a,);for(i=;i<=nn;i++) a[i]=a[i]*a[i];fft(a,-);
for(i=;i<=n+n;i++) ans[i]=(int)(a[i].x/nn+0.5); for(i=;i<=nn;i++) a[i].x=a[i].y=;
for(i=;i<=n;i++) a[i].x=(s[i]=='a'?:),a[i].y=; fft(a,);for(i=;i<=nn;i++) a[i]=a[i]*a[i];fft(a,-);
for(i=;i<=n+n;i++) ans[i]+=(int)(a[i].x/nn+0.5); for(i=;i<=n+n;i++) ans[i]=(ans[i]+)/;
int a1=;
bin[]=;for(i=;i<=n;i++) bin[i]=(bin[i-]*)%Mod;
for(i=;i<=n+n;i++) a1=(a1+bin[ans[i]])%Mod;
a1-=n+n+;
aa[]=;for(int i=;i<=n;i++) aa[*i+]=s[i]-'a',aa[*i+]=;aa[*n+]=;
a1-=get_manacher(*n+);
a1=(a1%Mod+Mod)%Mod;
printf("%d\n",a1);
return ;
}
【所以我现在会迭代打法了hhh
2017-04-13 18:42:35
【BZOJ 3160】 3160: 万径人踪灭 (FFT)的更多相关文章
- bzoj 3513: [MUTC2013]idiots FFT
bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...
- [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块)
[BZOJ 3509] [CodeChef] COUNTARI (FFT+分块) 题面 给出一个长度为n的数组,问有多少三元组\((i,j,k)\)满足\(i<j<k,a_j-a_i=a_ ...
- BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher
BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...
- BZOJ 3160: 万径人踪灭 [fft manacher]
3160: 万径人踪灭 题意:求一个序列有多少不连续的回文子序列 一开始zz了直接用\(2^{r_i}-1\) 总-回文子串 后者用manacher处理 前者,考虑回文有两种对称形式(以元素/缝隙作为 ...
- bzoj 3160 万径人踪灭——FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 似乎理解加深了. 用卷积算相同的位置:先把 a 赋成1. b 赋成0,卷积一遍:再把 ...
- bzoj 3160 万径人踪灭 —— FFT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3160 求出关于一个位置有多少对对称字母,如果 i 位置有 f[i] 对,对答案的贡献是 2^ ...
- bzoj 3160 万径人踪灭 FFT
万径人踪灭 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1936 Solved: 1076[Submit][Status][Discuss] De ...
- 【BZOJ】3160: 万径人踪灭 FFT+回文串
[题意]给定只含'a'和'b'字符串S,求不全连续的回文子序列数.n<=10^5. [算法]FFT+回文串 [题解]不全连续的回文子序列数=回文子序列总数-回文子串数. 回文子串数可以用回文串算 ...
- 【bzoj3160】万径人踪灭 FFT
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3160 我是一个傻叉 微笑脸 #include<bits/stdc++.h> #de ...
- BZOJ 3527: [Zjoi2014]力(FFT)
我们看一下这个函数,很容易就把他化为 E=sigma(aj/(i-j)/(i-j))(i>j)-sigma(aj/(i-j)/(i-j))(j>i) 把它拆成两半,可以发现分子与分母下标相 ...
随机推荐
- 【NOI2017】游戏 2-sat算法
[题目]LibreOJ [题意]n场游戏,有三种车ABC,给定长度为n的字符串,'a'表示不能选A,'b''c'同理,'x'表示不限,至多d个'x'.有m个限制(i,hi,j,hj)表示如果第i场选择 ...
- 第一周 ch01 课下测试
1.Amdahl定律说明,我们对系统的某个部分做出重大改进,可以显著获得一个系统的加速比.(B) A .正确 B .错误 解析:Amdahl定律,该定律的主要思想是,当我们对系统的某个部分加速时,其对 ...
- Coursera在线学习---第一节.梯度下降法与正规方程法求解模型参数比较
一.梯度下降法 优点:即使特征变量的维度n很大,该方法依然很有效 缺点:1)需要选择学习速率α 2)需要多次迭代 二.正规方程法(Normal Equation) 该方法可以一次性求解参数Θ 优点:1 ...
- 如何将vmworkstation的虚机导成ovf模版
如何将vmworkstation的虚机导成ovf模版 最近碰见一个事情挺烦的苦恼了我好长一段时间,是这样的公司要进行攻防演练需要搭建一个owaps的靶站练手,环境我在我的电脑上已经搭好了(vmwork ...
- python并发编程之multiprocessing进程(二)
python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. 系列文章 python并发编程之threading线程(一) python并 ...
- Linux CentOS 6.9(图形界面)安装中文输入法
安装步骤 1. 切换到 root 用户,执行 yum -y install "@Chinese Support" 2. 退出终端,选择桌面菜单中 "System" ...
- kvm 简单了解
网络: *主机(装有ESX的PC服务器)简称host,虚拟机简称guest *Host的一个或多个网卡组成一个虚拟交换机,虚拟交换机上创建端口组label,端口组指定vlan tag,虚拟机指定网络标 ...
- [node.js] async/await如何优雅处理异常?
node.js的世界,从callback开始,不会止于async. 所有人都在骂为什么不能完全进化,其实我感觉这就是老外的细心,为了承上.这也就是为什么async其实就是promise一样,假如不是一 ...
- PHP 不让标准浏览器(firfox,chrome等)走浏览器的缓存页面
或在HTML页面里加: <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache,no-store, must-reva ...
- TGPPen 宽度的理解
procedure TForm4.Button1Click(Sender: TObject); var g: TGPGraphics; p: TGPPen; begin g := TGPGraphic ...