BZOJ3160: 万径人踪灭(FFT,回文自动机)
解题思路:
FFT在处理卷积时可以将自己与自己卷,在某一种字母上标1其他标0,做字符集次就好了。
(回文就是直接对称可以联系偶函数定义理解,根据这个性质就可以将字符串反向实现字符串匹配)。
最后利用容斥回文字符2的次幂-回文串就好了。
回文串计数当然要回文自动机了。
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
const int maxn=;
const double PI=acos(-1.0);
const lnt mod=(lnt)(1e9+);
struct cp{
double x,y;
cp(){};
cp(double a,double b){x=a,y=b;}
cp friend operator + (cp a,cp b){return cp(a.x+b.x,a.y+b.y);}
cp friend operator - (cp a,cp b){return cp(a.x-b.x,a.y-b.y);}
cp friend operator * (cp a,cp b){return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
}A[maxn],B[maxn],C[maxn];
struct PAM{
struct pant{
int tranc[];
int len;
int pre;
int wgt;
}h[maxn];
int siz;
int fin;
lnt ans;
bool mis(char *a,int i,int lsp)
{
return a[i]!=a[i-h[lsp].len-];
}
void Insert(char *a,int i)
{
int nwp,lsp,mac;
lsp=fin;
int c=a[i]-'a';
while(mis(a,i,lsp))
lsp=h[lsp].pre;
if(!h[lsp].tranc[c])
{
nwp=++siz;
mac=h[lsp].pre;
h[nwp].len=h[lsp].len+;
while(mis(a,i,mac))
mac=h[mac].pre;
h[nwp].pre=h[mac].tranc[c];
h[lsp].tranc[c]=nwp;
h[nwp].wgt=h[h[nwp].pre].wgt+;
}
fin=h[lsp].tranc[c];
ans+=h[fin].wgt;
return ;
}
PAM(){}
PAM(char *a,int n)
{
ans=;
siz=;
fin=;
h[].pre=h[].pre=;
h[].len=-;
h[].len=;
for(int i=;i<=n;i++)
Insert(a,i);
}
lnt val(void)
{
return ans;
}
};
int lim;
int len;
int n,m;
int pos[maxn];
lnt pow2[maxn];
char str[maxn];
void getpos(void)
{
for(int i=;i<len;i++)
pos[i]=(pos[i>>]>>)|((i&)<<(lim-));
return ;
}
void Fft(cp *a,double flag)
{
for(int i=;i<len;i++)
if(i<pos[i])
std::swap(a[i],a[pos[i]]);
for(int i=;i<=len;i<<=)
{
cp wn(cos(2.00*PI*flag/(double)(i)),sin(2.00*PI*flag/(double)(i)));
for(int j=;j<len;j+=i)
{
cp w(1.00,0.00),t;
for(int k=;k<(i>>);k++,w=w*wn)
{
t=a[k+j+(i>>)]*w;
a[j+k+(i>>)]=a[j+k]-t;
a[j+k]=a[j+k]+t;
}
}
}
return ;
}
int main()
{
scanf("%s",str+);
int lth=strlen(str+);
for(int i=;i<=lth;i++)
if(str[i]=='a')
A[i-].x=1.00;
else
B[i-].x=1.00;
while((<<lim)<(lth<<))
lim++;
len=<<lim;
getpos();
Fft(A,);
Fft(B,);
for(int i=;i<len;i++)
A[i]=A[i]*A[i]+B[i]*B[i];
Fft(A,-);
pow2[]=;
for(int i=;i<=len;i++)
pow2[i]=pow2[i-]*2ll%mod;
lnt ans=;
for(int i=;i<len;i++)
ans=(ans+pow2[((lnt)(A[i].x/(double)(len)+0.5)+1ll)/]-1ll)%mod;
PAM P(str,lth);
ans=((ans-P.val())%mod+mod)%mod;
printf("%lld\n",ans);
return ;
}
BZOJ3160: 万径人踪灭(FFT,回文自动机)的更多相关文章
- 【BZOJ】3160: 万径人踪灭 FFT+回文串
[题意]给定只含'a'和'b'字符串S,求不全连续的回文子序列数.n<=10^5. [算法]FFT+回文串 [题解]不全连续的回文子序列数=回文子序列总数-回文子串数. 回文子串数可以用回文串算 ...
- bzoj3160(FFT+回文自动机)
题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=3160 题解 先把问题转化一下,我们要求的是非连续对称回文子序列. ans=回文子序列数- ...
- 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]双倍回文——回文自动机
题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...
随机推荐
- Linux Sendfile 的优势
Sendfile 函数在两个文件描写叙述符之间直接传递数据(全然在内核中操作,传送),从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝,操作效率非常高,被称之为零拷贝. Sendfile 函数的定义 ...
- poj 2240 Bellman-Flod 求环
http://poj.org/problem?id=2240 深刻体现了自己代码能力有问题外加改模板能力有问题.外加Debug有问题.以后做到: 1.算法原理能够轻易弄出来. 2.代码模板自己收集各种 ...
- 特定位取反(js实现)
去华为面试的时候.没有做好准备工作.面试的流程没有问清也没有查,结果一过去就让上机做题,着实有点措手不及.笔者是擅长前端的Java Webproject师啊,主要的底层编程知识早已生疏了.机试题碰到了 ...
- thinkphp5项目--企业单车网站(二)
thinkphp5项目--企业单车网站(二) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Websitehttps:/ ...
- POJ 3281 网络流
题意: 思路: 网络流 重在建图- 建完了图 就一切都好说了 这道题 我的想法是 先把源点和所有的食品连上边 (容量为1) 再把食品和对应的奶牛连上边 (容量为1) 这个时候要拆点 因为每只奶牛只能才 ...
- 快速select算法的实现
代码来自: http://blog.csdn.net/v_JULY_v 算法思想: // Quick_select.cpp : 定义控制台应用程序的入口点. // #include "std ...
- JAVA中jar包和war包的区别是
其实jar包和war包都可以看成压缩文件,用解压软件都可以打开,jar包和war包所存在的原因是,为了项目的部署和发布,通常把项目打包,通常在打包部署的时候,会在里面加上部署的相关信息. 这个打包实际 ...
- Ubuntu16.04+Gnome3 锁定屏幕快捷键无效解决办法
Ubuntu16.04 桌面环境通过Ubuntu server和后安装的Gnome3 桌面环境实现,安装完以后发现锁定屏幕快捷键无效,系统设置=>键盘=>快捷中 锁屏快捷键已经存在Supe ...
- Object-C初体验
前几周,看了书,标记了要Coding的例子.(书是写博客,CSDN送的,也可以用C币买) 周末,来搞几个例子. 2015年春,刚刚买Mac的时候,就搞了1个Object-C的HelloWorld,毕竟 ...
- 如何形象的解释 webhook 这个词
就是一个 callback,只不过 callback 的操作是发送指定的 HTTP request 给一个指定的地址. callback 就是由甲传给乙,乙处理完之后通知甲传过来的方法或者请求甲方的 ...