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$ ...
随机推荐
- iOS开发中常用到的加密方式
1 base64 1.1 简介 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24位数据,再把这24位数据 ...
- android开发工具类之获得WIFI IP地址或者手机网络IP
有的时候我们需要获得WIFI的IP地址获得手机网络的IP地址,这是一个工具类,专门解决这个问题,这里需要两个权限: <uses-permission android:name="and ...
- asp.net下载的方法1
1. 首先新建一个用于进行下载处理的page页,如download.aspx,里面什么东西也没有. 2. 添加一个DownloadHandler类,它继承于IHttpHandler接口,可以用来自定义 ...
- iOS之NSNotificationCenter通知中心使用事项
其实这里的通知和之前说到的KVO功能很想,也是用于监听操作的,但是和KVO不同的是,KVO只用来监听属性值的变化,这个发送监听的操作是系统控制的,我们控制不了,我们只能控制监听操作,类似于Androi ...
- Css3炫酷总结使用
先从CSS3的选择器说起: E F:所有的子孙元素: E>F: E中的子元素: E+F:E元素之后的最近的选择器: E~F:E中所以后面兄弟元素(CSS3 不包括自己本身,前面也不包括) att ...
- java Spring 生命周期
1.初始化回调 <bean name="userService" class="com.sun.service.UserService" init-met ...
- UML 行为图之用例图 总结
学习UML图形 推荐阅读<UML参考手册>第2版. http://www.umlchina.com/ 推荐微软的开发软件设计模型 http://msdn.microsoft.com/zh ...
- spring MVC fromeWork 與webwork2 mvc 比較
http://www.blogjava.net/xxxzheng/articles/7614.html 在当今的MVC framework里,似乎Webwork2逐渐成为主流, Webwork2+Sp ...
- 并行计算vs分布式计算
一般认为,集中在同一个机柜内或同一个地点的紧密耦合多处理机系统或大规模并行处理系统是并行处理系统,而用局域网或广域网连接的计算机系统是分布式处理系统.松散耦合并行计算机中的并行操作系统有时也称为分布式 ...
- C#中 字符串的处理
3.字符串 1).字符串的不可变性 当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储新值. 当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向,则立即把它销毁. 2).我 ...