【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) 把它拆成两半,可以发现分子与分母下标相 ...
随机推荐
- DHTML中window的使用
window对象是对浏览器窗口进行操作的对象.以下列出一些常用的对象(三级为对象的方法.属性) |-navigator:是对浏览器信息进行操作的对象 |-history:包含用户浏览过的url信息 | ...
- [csp-201809-3]元素选择器-编译原理
声明:同样是参考照抄hyh学长的代码!(有问题我马上删这篇emm 题目链接:http://118.190.20.162/view.page?gpid=T77 题面: 这棵树的样子(同样是来自学长的图) ...
- ActiveMQ笔记之安装(Linux)
1. 基本概念 MQ(MessageQueue),消息队列,是一个消息接收和转发的容器. Apache ActiveMQ是一个JMS Provider实现. 2. 安装 从官网下载安装包: wget ...
- NB二人组(二)----归并排序
归并排序的思路: 归并算法程序(配合下图进行思考): def merge(li,low,mid,high): i = low j = mid + 1 ltmp=[] while i <= mid ...
- Tinyos Makerules解读
Makerules 文件解读 位于/opt/tinyos-2.1.2/support/make #-*-Makefile-*- vim:syntax=make #$Id: Makerules,v 1. ...
- centos7下vi的用法
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...
- java基础2 判断语句:if ... else 语句和 switch 语句
一.if ... else 判断语句 1.if ... else 判断语句的格式 1.1.格式一 if(判断条件){ 执行不满足条件的语句 } 1.2.格式二 if(判断语句){ 满足条件的语句 }e ...
- java并发编程实战笔记---(第四章)对象的组合
4.1设计线程安全的类 包含三个基本要素: 1.找出构成对象状态的所有变量 2.找出约束状态变量的不变性条件 2.简历对象状态的并发访问管理策略 对象的状态: 域 基本类型所有域, 引用类型包括被引用 ...
- Codefroces 735D Taxes(哥德巴赫猜想)
题目链接:http://codeforces.com/problemset/problem/735/D 题目大意:给一个n,n可以被分解成n1+n2+n3+....nk(1=<k<=n). ...
- Js添加、读取、删除cookie,判断cookie是否有效,指定domain域下主路径path下设置cookie,设置expires过期时间
有时我们需要用cookie保存用户名,记录登录状态,如何正确判断该机用户cookie是否存在呢?不能简单使用a!=”这样的写法. 正确方法是:判断是否存在名为username3的cookie,使用do ...
.jpg)
.jpg)
.jpg)