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

  1. bzoj 3160: 万径人踪灭【FFT+manacher】

    考虑正难则反,我们计算所有对称子序列个数,再减去连续的 这里减去连续的很简单,manacher即可 然后考虑总的,注意到关于一个中心对称的两点下标和相同(这样也能包含以空位为对称中心的方案),所以设f ...

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

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

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

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

  4. 【BZOJ 3160】 3160: 万径人踪灭 (FFT)

    3160: 万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1440  Solved: 799 Description Input Outp ...

  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: 万径人踪灭

    Description 一个ab串,问有多少回文子序列,字母和位置都对称,并且不连续. Sol FFT+Manacher. 不连续只需要减去连续的就可以了,连续的可以直接Manacher算出来. 其他 ...

  9. BZOJ 3160 万径人踪灭 解题报告

    这个题感觉很神呀.将 FFT 和 Manacher 有机结合在了一起. 首先我们不管那个 “不能连续” 的条件,那么我们就可以求出有多少对字母关于某一条直线对称,然后记 $T_i$ 为关于直线 $i$ ...

随机推荐

  1. Linux Ubuntu上架设FTP

    操作系统:ubuntu (GNU/Linux) 为了在机子上架设ftp服务器,我们需要安装ftp服务器软件.Linux下具有代表性的ftp服务器软件有Wu-FTP,ProFTP和Vsftp.Wu-FT ...

  2. Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例

    1. 把集合中的数据存储到文本文件案例:    需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字 ...

  3. zzzzw_在线考试系统③完结篇

    昨天填完原本打算写有关“学生考试部门”的总结,但是因为时间来不及,所以推迟到今天来写. 至于最后的:“老师登录”部门就没什么好说的了,只要会了“管理员部分”和“学生考试部分”的书写,剩下就只是耐心的一 ...

  4. win向linux传文件

    使用pscp.exe即可. 下载pscp.exe(http://pan.baidu.com/s/1jG6zmx4) 复制到windows/system32目录下即可. 然后可在cmd命令行下使用psc ...

  5. iOS afnetworking最新版报错 没有AFHTTPRequestOperationManager类了

    今天开了一个小项目   用的是pod   然后  安装好 Afnetworking之后   发现 AFHTTPRequestOperationManager  这个类没有了  ,百度之后  发现 原来 ...

  6. cocoa pods

    # cocoa pods * `CocoaPods` 是 iOS 最常用最有名的类库管理工具 * 作为 iOS 程序员,掌握 `CocoaPods` 的使用是必不可少的基本技能 ## pod 命令汇总 ...

  7. jQuery弹性滑块导航

    曾起何时在某网站上看到一弹性滑块导航的效果,瞬间被些效果吸引,开始以为是用FLASH实现的,但查源代码发现用的是JQuery缓动效果. 今天心血来潮想拿这个效果练练手.也看看这段时间学习JS及jque ...

  8. jeesite 一对多,对子表单独修改时出现 HV000030: No validator could be found for type:

    这是由于springmvc校验功能造成的,解决办法参见我的百度回答 http://zhidao.baidu.com/question/2141673418419314468

  9. IOS 学习笔记 2015-04-15 手势密码(原)

    // // WPSignPasswordView.h // 网投网 // // Created by wangtouwang on 15/4/9. // Copyright (c) 2015年 wan ...

  10. 《精通CSS-高级Web标准解决方案》阅读计划

    第一周     第1章 基础知识 1 第2章 为样式找到应用目标 1 第3章 可视化格式模型 1 第4章 背景图像效果 1       第二周     第5章 对链接应用样式 1 第6章 对列表应用样 ...