bzoj3160(FFT+回文自动机)
题目描述
https://www.lydsy.com/JudgeOnline/problem.php?id=3160
题解
先把问题转化一下,我们要求的是非连续对称回文子序列。
ans=回文子序列数-回文子串数。
回文子串数可以用PAM或manachar求出来。
复习了一下PAM,用它求回文子串数和SAM一样,就是size[fa[i]]+=size[i],这时每一个节点代表的是所有它的后缀回文串。
然后怎么求回文子序列数。
考虑每一条对称轴,它能被谁贡献。
f[(i+j)/2]可以被i和j更新,当i和j是一种字符时。然后我们把前面的/2去掉,然后这个可以用卷积做。
最后我们发现对于一对字符会被统计两次,但是对于对称中心的字符只会被统计一次,所以我们/2时要向下取整。
坑点:PAM的size
last=ch[last][s[i]-'a'];size[last]++;
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 100009
using namespace std;
typedef long long ll;
const int mod=1e9+;
const double pai=acos(-1.0);
ll ans;
int len[N],cnt,last,fail[N],ch[N][],size[N];
int L,l,n,rev[N<<];
char s[N];
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
inline int power(ll x,int y){
ll ans=;
while(y){
if(y&)ans=(ans*x)%mod;
x=(x*x)%mod;
y>>=;
}
return ans;
}
struct fs{
double x,y;
fs(){}
fs(double xx,double yy){x=xx;y=yy;}
fs operator +(const fs &b)const{return fs{x+b.x,y+b.y};}
fs operator -(const fs &b)const{return fs{x-b.x,y-b.y};}
fs operator *(const fs &b)const{return fs{x*b.x-y*b.y,x*b.y+y*b.x};}
}a[N<<],b[N<<];
inline void FFT(fs *a,int tag){
for(int i=;i<l;++i)if(rev[i]>i)swap(a[i],a[rev[i]]);
for(int i=;i<l;i<<=){
fs wn(cos(pai/i),tag*sin(pai/i));
for(int j=;j<l;j+=(i<<)){
fs w(,);
for(int k=;k<i;++k,w=w*wn){
fs x=a[j+k],y=w*a[k+i+j];
a[j+k]=x+y;a[i+j+k]=x-y;
}
}
}
}
int main(){
scanf("%s",s+);n=strlen(s+);
l=;L=;while(l<=(n<<))l<<=,++L;
for(int i=;i<l;++i)rev[i]=(rev[i>>]>>)|((i&)<<(L-));
for(int i=;i<=n;++i)if(s[i]=='a')a[i].x=;else b[i].x=;
FFT(a,);FFT(b,);
for(int i=;i<l;++i)a[i]=a[i]*a[i]+b[i]*b[i];FFT(a,-);
for(int i=;i<l;++i)a[i].x=(int)(a[i].x/l+0.1);
for(int i=;i<l;++i)ans=(ans+power(,ceil((double)a[i].x/))-)%mod;
cnt=last=;len[]=-;fail[]=;
for(int i=;i<=n;++i){
while(s[i-len[last]-]!=s[i])last=fail[last];
if(!ch[last][s[i]-'a']){
len[++cnt]=len[last]+;
int y=fail[last];
while(s[i-len[y]-]!=s[i])y=fail[y];
fail[cnt]=ch[y][s[i]-'a'];ch[last][s[i]-'a']=cnt;
}
last=ch[last][s[i]-'a'];size[last]++;
}
for(int i=cnt;i;--i)(size[fail[i]]+=size[i])%=mod;
for(int i=;i<=cnt;++i)ans=(ans-size[i]+mod)%mod;
cout<<ans;
return ;
}
bzoj3160(FFT+回文自动机)的更多相关文章
- BZOJ3160: 万径人踪灭(FFT,回文自动机)
BZOJ传送门: 解题思路: FFT在处理卷积时可以将自己与自己卷,在某一种字母上标1其他标0,做字符集次就好了. (回文就是直接对称可以联系偶函数定义理解,根据这个性质就可以将字符串反向实现字符串匹 ...
- URAL 2040 (回文自动机)
Problem Palindromes and Super Abilities 2 (URAL2040) 题目大意 给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量. 解题分析 ...
- URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
Palindromes and Super Abilities 2 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/E Descr ...
- 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做
题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...
- [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串
回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...
- BZOJ2160拉拉队排练——回文自动机
题目描述 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多 ...
- BZOJ2084[Poi2010]Antisymmetry——回文自动机
题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的0 ...
- BZOJ2342[Shoi2011]双倍回文——回文自动机
题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...
- 【XSY2715】回文串 树链剖分 回文自动机
题目描述 有一个字符串\(s\),长度为\(n\).有\(m\)个操作: \(addl ~c\):在\(s\)左边加上一个字符\(c\) \(addr~c\):在\(s\)右边加上一个字符 \(tra ...
随机推荐
- css3的clip-path方法剪裁实现
本例讲解如何通过clip-path把一个div(元素,可以是图片等)裁切成不同的形状,这里以一个div为例宽高均为300px 注意:不支持IE和Firefox,支持webkit浏览器,在现代浏览器中需 ...
- python之路--小数据池,再谈编码,is和 == 的区别
一 . 小数据池 # 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. # id() 查看变量的内存地址 s = 'attila' print(id(s)) 二 ...
- python学习笔记(7)--循环语句
循环语句如下: for i in range(start, end): //注意 前闭后开 coding for i in range(m,n,k): coding for c in s: codin ...
- 无法将从VSS中的解决方案添加到TFS的源代码管理器中
VSS是一种非常有用的项目文件管理工具,百度百科的解释是:VSS 的全称为 Visual Source Safe .作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责 ...
- KVM+QEMU虚拟化概念
概念: KVM,即Kernel-basedvirtual machine,由redhat开发,是一种开源.免费的虚拟化技术.对企业来说,是一种可选的虚拟化解决方案. 定义:基于Linux内核的虚拟机 ...
- orecal基本连接数据库简介
整理自互联网 一. jdbc:oracle:thin:@192.168.3.98:1521:orcljdbc:表示采用jdbc方式连接数据库oracle:表示连接的是oracle数据库thin:表示连 ...
- XCTF 4th-WHCTF-2017 creakme
exe文件 运行一下 随便输一下 ps.这个曹操身边的故事挺有意思的 但是没啥卵用....... 查一下壳无壳 ida载入 发现找不到main函数 直接看start感觉逻辑乱乱的(萌新求不喷..... ...
- javap指令
栈和局部变量操作将常量压入栈的指令aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类型常量0压入栈iconst_1 将int类型 ...
- 学习 Spring (十六) AOP API
Spring入门篇 学习笔记 Spring AOP API 是 Spring 1.2 历史用法,现在仍然支持 这是 Spring AOP 基础,现在的用法也是基于历史的,只是更简便了 Pointcut ...
- Jenkins+PowerShell持续集成环境搭建(六)参数化构建
参数化构建可以应用于动态绑定源码地址等情况. 勾选“This build is parameterized”: 如果需要动态绑定源码地址,参考: 配置完成后构建项目变成: