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多线程开发--NSThread NSOperation GCD
多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势 ...
- gdal和python在windows上的安装
GDAL is a useful command line tool to process spatial data, if you haven’t heard of the tool before ...
- Calendar 类的应用
上一篇 说的 Date 类 最主要的作用就是获得当前时间,同事这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法却遭到众多的批评,不推荐使用,要推荐使用Calendar 类进 ...
- java Spring 在WEB应用中的实例化
.前面讲解的都是通过直接读取配置文件,进行的实例化ApplicationContext AbstractApplicationContext app = new ClassPathXmlApplica ...
- 20160330javaweb之session 小练习
练习一:session 实现登录注销 package com.dzq.session.logout; import java.util.*; public class UserDao { /** * ...
- Android应用程序消息处理机制笔记
看老罗的Android源码情景分析学习的时候,边抄边理解再总结.希望能为面试提供点帮助吧. 1.Android应用程序是通过消息来驱动,Android应用程序每一个线程在启动时,都可以首先在内部创建一 ...
- C#获取当前路径,获取当前路径的上一层路径
C#获取当前路径的方法如下: (1)string path1 = System.Environment.CurrentDirectory; //C:\...\bin\Debug -获取和设置当前工作目 ...
- JavaScript之Function类型
1. 创建方式 //1.函数声明 function sum(num1,num2){ return num1+num2; } //2.函数表达式 var sum = function(num1,num2 ...
- iOS app提交审核 11.13条款问题
今年开年到现在.提交app应用一直招拒,这个问题我想不明白,感觉就是一个坑.所以贴出来给大家看看. 发件人 Apple11.13 - Apps that link to external mechan ...
- iOS-事务相关
事务管理 事务(Transaction):1.构成单一逻辑工作单元的操作集合DBMS中的用户程序DBMS外的可执行程序对数据库的读/写操作序列2.读从数据库中读取数据,首先从磁盘中读到内存(Buffe ...