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. 超越icon font

    很久以前,我们如何使用图标? 1.切图 2.拼合(Sprites) 原始社会啊! 后来CSSGagagrunt-css-sprite 字体图标 相见不曾相识 Emoji绘文字 iconfont.cn直 ...

  2. 在外网使用ssh连接内网中的多台Linux服务器

    最近因为要对全球工控机网络进行协议扫描,需要在实验室配置几台服务器,因为我们只有一个IP地址,所以是用路由器搭建了一个内网(拓扑结构如下图).但是这样做了之后无法在宿舍通过ssh直接连接服务器,因为那 ...

  3. NYOJ 141 Squares (数学)

    题目链接 描述 A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degre ...

  4. Python3中的SocketServer

    socket并不能多并发,只能支持一个用户,socketserver 简化了编写网络服务程序的任务,socketserver是socket的在封装.socketserver在python2中为Sock ...

  5. notepad++突然崩溃,保存的文件没了怎么办

    在C:\Users\你当前用户的用户名\AppData\Roaming\Notepad++\backup  有备份

  6. linux的主题与图标

    我先在使用arch跟xfce, 速度没得说,偶尔用一下openbox 有一天将xfce的声音给搞没了,完全不知道哪里配置错了,只好将用户文件夹下的所有配置删除,然后重启进入一切又ok啦 说一下主题,小 ...

  7. webconfig的配置解析

    <?xml version="1.0"?> <!--注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来配置应用程序的设置.可以使用 Visual S ...

  8. 在Nginx服务器上屏蔽IP

    采集和防止采集是一个经久不息的话题,一方面都想搞别人的东西,另一方面不想自己的东西被别人搞走. 本文介绍如何利用nginx屏蔽ip来实现防止采集,当然也可以通过iptable来实现. 1.查找要屏蔽的 ...

  9. iTextSharp操作pdf之pdfCreater

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. SQLserver连接本地服务器

    1.打开SQLserver “连接到服务器” 2.服务器类型:数据库引擎 3.服务器名称:浏览更多->本地服务器->数据库引擎->选择本地服务器 4.身份验证:windows验证 5 ...