bzoj 3160: 万径人踪灭 manachar + FFT
3160: 万径人踪灭
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 133 Solved: 80
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
以每一个位置为中心,分别处理连续一块的回文串,回文序列个数。
比较容易看出是FFT+manachar,但是FFT还是不太熟悉,特别要注意三层for语句中i,j,k不能写错,这东西很难调试出来。
另外一点就是manachar加‘#’最好头尾都加,要不然第一个,最后一个字符回文串长度会出问题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define MAXN 610000
#define MOD 1000000007
typedef long long qword;
typedef double real;
const real pi=acos(-);
struct Complex
{
real x,y;
Complex(real x,real y=):x(x),y(y){}
Complex(){}
};
Complex operator +(Complex c1,Complex c2)
{
return Complex(c1.x+c2.x,c1.y+c2.y);
}
Complex operator -(Complex c1,Complex c2)
{
return Complex(c1.x-c2.x,c1.y-c2.y);
}
Complex operator *(Complex c1,Complex c2)
{
return Complex(c1.x*c2.x-c1.y*c2.y,c1.x*c2.y+c1.y*c2.x);
}
Complex operator /(Complex c1,real x)
{
return Complex(c1.x/x,c1.y/x);
}
Complex g1[MAXN],g2[MAXN],g3[MAXN];
Complex gt[MAXN];
void FFT(Complex gg[],int l,int pp)
{
memcpy(gt,gg,sizeof(gt[])*l);
int x;
for (int i=;i<l;i++)
{
x=;
for (int j=,k=l>>;j<l;j<<=,k>>=)
if (i&j)x+=k;
gg[i]=gt[x];
}
Complex w;
Complex wn;
Complex tmp;
for (int i=;i<l;i<<=)
{
wn=Complex(cos(pi/i*pp),sin(pi/i*pp));
for (int j=;j<l;j+=(i<<))
{
w=Complex(,);
for (int k=;k<i;k++)
{
tmp=gg[j+k];
gg[j+k]=gg[j+k]+gg[i+j+k]*w;
gg[i+j+k]=tmp-w*gg[i+j+k];
w=w*wn;
}
}
}
}
qword pow_mod(qword x,qword y)
{
qword ret=;
while (y)
{
if (y&)ret=ret*x%MOD;
x=x*x%MOD;
y>>=;
}
return ret;
}
char str[MAXN];
char str2[MAXN];
int plen[MAXN];
int plen2[MAXN];
void manachar(int l)
{
int id=-,mx=;
for (int i=;i<l;i++)
{
if (mx>i)
plen[i]=min(mx-i,plen[id*-i]);
while (i-plen[i]->= && i+plen[i]+<l && str2[i-plen[i]-]==str2[i+plen[i]+])
plen[i]++;
if (i+plen[i]>mx)
{
mx=i+plen[i];
id=i;
}
}
}
qword mi2[MAXN];
int main()
{
freopen("input.txt","r",stdin);
int n,m;
int x,y;
int l;
scanf("%s",str);
n=strlen(str);
l=n*+;
mi2[]=;
for (int i=;i<=l;i++)mi2[i]=mi2[i-]*%MOD;
for (int i=;i<n*+;i++)
str2[i]='#';
for (int i=;i<n;i++)
{
if (str[i]=='a')
{
g1[i*+]=g2[i*+]=;
str2[i*+]='a';
}else
{
g1[i*+]=g2[i*+]=-;
str2[i*+]='b';
}
}
manachar(l);
for (l=n*;l!=(l&(-l));l-=l&(-l));
l<<=;
FFT(g1,l,);
FFT(g2,l,);
for (int i=;i<l;i++)g3[i]=g1[i]*g2[i];
FFT(g3,l,-);
for (int i=;i<l;i++)g3[i]=g3[i]/l;
l=n*;
for (int i=;i<l;i++)plen[i]++;
qword ans=;
for (int i=;i<l;i++)
plen2[i]=((min(i,l-i-)+)+round(g3[i*].x))/;
for (int i=;i<l;i++)plen2[i]=(plen2[i]+)/;
for (int i=;i<l;i++)plen[i]=plen[i]/;
for (int i=;i<l;i++)
ans=(ans+mi2[plen2[i]]--plen[i])%MOD;
printf("%lld\n",ans);
return ;
}
bzoj 3160: 万径人踪灭 manachar + FFT的更多相关文章
- bzoj 3160: 万径人踪灭【FFT+manacher】
考虑正难则反,我们计算所有对称子序列个数,再减去连续的 这里减去连续的很简单,manacher即可 然后考虑总的,注意到关于一个中心对称的两点下标和相同(这样也能包含以空位为对称中心的方案),所以设f ...
- BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher
BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...
- BZOJ 3160: 万径人踪灭 [fft manacher]
3160: 万径人踪灭 题意:求一个序列有多少不连续的回文子序列 一开始zz了直接用\(2^{r_i}-1\) 总-回文子串 后者用manacher处理 前者,考虑回文有两种对称形式(以元素/缝隙作为 ...
- 【BZOJ 3160】 3160: 万径人踪灭 (FFT)
3160: 万径人踪灭 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1440 Solved: 799 Description Input Outp ...
- 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: 万径人踪灭
Description 一个ab串,问有多少回文子序列,字母和位置都对称,并且不连续. Sol FFT+Manacher. 不连续只需要减去连续的就可以了,连续的可以直接Manacher算出来. 其他 ...
- BZOJ 3160 万径人踪灭 解题报告
这个题感觉很神呀.将 FFT 和 Manacher 有机结合在了一起. 首先我们不管那个 “不能连续” 的条件,那么我们就可以求出有多少对字母关于某一条直线对称,然后记 $T_i$ 为关于直线 $i$ ...
随机推荐
- SecureCRT恢复默认字体
1\要想永久的改变的就跟我来吧,选项--全局选项--常规--默认会话--编辑默认设置--外观--当前颜色方案--选择自己喜欢的方案就行啦,然后选择保存就OK啦方案二: 自从装了Win7之后,觉得sec ...
- SVN源代码泄露
1. 联想b2b站SVN源代码泄露 开启Firefox,输入:b2b.thinkworldshop.com.cn/.svn/entries Webserver返回如下信息:
- .Net设计模式_建造者模式
引言: 建造者的特点是过程,需要建造对象的过程是一样的,如:软件项目,过程都是,POC.投标.立项.软件过程.收款,那么标准的软件项目都是这个过程,只是不同的项目在做这个过程的内容不一样.所以需要有一 ...
- html 笔记
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- hibernate简单应用
Hibernate 第二章 核心API 和CURD实现 核心API介绍 单表操作方法 查询hql语句 1.认识hibernate 核心思想ORM:实现数据库中的文件一一映射为java中的实体类. 使用 ...
- HINSTANCE数据类型
作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...
- 图灵API
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine( ...
- flexpaper 开源轻量级的在浏览器上显示各种文档的组件
FlexPaper是一个开源轻量级的在浏览器上显示各种文档的组件,被设计用来与PDF2SWF一起使用, 使在Flex中显示PDF成为可能,而这个过程并无需PDF软件环境的支持.它可以被当做Flex的库 ...
- cocoa pods
# cocoa pods * `CocoaPods` 是 iOS 最常用最有名的类库管理工具 * 作为 iOS 程序员,掌握 `CocoaPods` 的使用是必不可少的基本技能 ## pod 命令汇总 ...
- iOS-事务相关
事务管理 事务(Transaction):1.构成单一逻辑工作单元的操作集合DBMS中的用户程序DBMS外的可执行程序对数据库的读/写操作序列2.读从数据库中读取数据,首先从磁盘中读到内存(Buffe ...