3160: 万径人踪灭

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 1440  Solved: 799

Description

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)的更多相关文章

  1. bzoj 3513: [MUTC2013]idiots FFT

    bzoj 3513: [MUTC2013]idiots FFT 链接 bzoj 思路 参考了学姐TRTTG的题解 统计合法方案,最后除以总方案. 合法方案要不好统计,统计不合法方案. \(a+b< ...

  2. [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块)

    [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块) 题面 给出一个长度为n的数组,问有多少三元组\((i,j,k)\)满足\(i<j<k,a_j-a_i=a_ ...

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

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

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

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

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

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

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

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

  7. bzoj 3160 万径人踪灭 FFT

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

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

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

  9. 【bzoj3160】万径人踪灭 FFT

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3160 我是一个傻叉 微笑脸 #include<bits/stdc++.h> #de ...

  10. BZOJ 3527: [Zjoi2014]力(FFT)

    我们看一下这个函数,很容易就把他化为 E=sigma(aj/(i-j)/(i-j))(i>j)-sigma(aj/(i-j)/(i-j))(j>i) 把它拆成两半,可以发现分子与分母下标相 ...

随机推荐

  1. solr笔记之安装部署到tomcat

    1. 下载 solr 去官网下载,下载的时候选清华的镜像源,这个页面:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/7.1.0/ 在/ ...

  2. three.js轨道控制器OrbitControls.js

    https://blog.csdn.net/qq_37338983/article/details/78575333 文章地址

  3. kippo蜜罐搭建

    kippo蜜罐搭建 总结一下kippo蜜罐搭建的方法,centos系统.kippo-master.zip的安装包 (gcc,python-devel,pip,twisted==13.10,pycryp ...

  4. 大数据系列之Hadoop框架

    Hadoop框架中,有很多优秀的工具,帮助我们解决工作中的问题. Hadoop的位置 从上图可以看出,越往右,实时性越高,越往上,涉及到算法等越多. 越往上,越往右就越火…… Hadoop框架中一些简 ...

  5. Gym 101081K Pope's work

    题目链接:Gym - 101081K 题意:给n个箱子,每个箱子有一个重量W和一个承重R,表示它上面能放最多R-W的重量.问最多能把多少箱子堆到一堆. 思路:发现在一堆箱子里,两个箱子交换位置,对其他 ...

  6. 关于一些对location认识的误区

    1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通,再匹配正则”解释 ...

  7. C中常用格式格式码

    一.常用printf格式码 二.常用scanf格式码

  8. web deploy 安装失败解决

    单独运行安装包,提示脚本运行失败. VS安装提示解包失败. 解决:检查Windows Management Instrumentation服务状态.需要非禁用.

  9. pip安装模块时:error: command 'gcc' failed with exit status 1

    用安装python模块出现error: command 'gcc' failed with exit status 1 问题: gcc编译缺少模块 解决方法: yum install gcc libf ...

  10. windows下phpstrom中xdebug的使用

    https://laravel-china.org/articles/16425/windows-phpstorm-xdebug-breakpoint-debugging