BZOJ传送门:

解题思路:

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,回文自动机)的更多相关文章

  1. 【BZOJ】3160: 万径人踪灭 FFT+回文串

    [题意]给定只含'a'和'b'字符串S,求不全连续的回文子序列数.n<=10^5. [算法]FFT+回文串 [题解]不全连续的回文子序列数=回文子序列总数-回文子串数. 回文子串数可以用回文串算 ...

  2. bzoj3160(FFT+回文自动机)

    题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=3160 题解 先把问题转化一下,我们要求的是非连续对称回文子序列. ans=回文子序列数- ...

  3. URAL 2040 (回文自动机)

    Problem Palindromes and Super Abilities 2 (URAL2040) 题目大意 给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量. 解题分析 ...

  4. URAL 2040 Palindromes and Super Abilities 2 (回文自动机)

    Palindromes and Super Abilities 2 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/E Descr ...

  5. 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做

    题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...

  6. [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串

    回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...

  7. BZOJ2160拉拉队排练——回文自动机

    题目描述 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多 ...

  8. BZOJ2084[Poi2010]Antisymmetry——回文自动机

    题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的0 ...

  9. BZOJ2342[Shoi2011]双倍回文——回文自动机

    题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...

随机推荐

  1. CheckBox:屏蔽setChecked方法对OnCheckedChangeListener的影响

    对于CheckBox的OnCheckedChangeListener,有两种情况下会被触发: (1)用户点击了一下CheckBox: (2)代码中调用了setChecked(boolean check ...

  2. Node.js的helloworld 程序

    用文本编辑器.如npp,键入例如以下代码.存储成hello.js console.log('hello') console.log('hello %s->%d','jeapedu', 19418 ...

  3. doT.js灵活运用之嵌入使用

    基础的base_info_area <div id="base_info_area"></div> <script type="text/h ...

  4. quartz 持久化 数据库表

    此处只包括配置数据库操作 quartz 持久化数据库表格字段解释建表,SQL语句在dbTables文件夹中可以找到,介绍下我们开发主要使用到的表: (版本不一样,可能数据库表也不一样,这里使用2.2. ...

  5. DispatcherServlet 前置控制器

    1.DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容 ...

  6. 通过不修改arc.archives.class.php而保留原有样式调上一篇下

    今天织梦58站长分享一个织梦内容页上下篇的调用方法,估计在大家在仿站的过程中,经常会碰到原站的上下篇很美观,比如如图类似的这种:或,但是用织梦原有调用上下篇的标签来调用,总达不到我们想要的效果,找不到 ...

  7. 如何批量telnet查看否开放指定端口

    由于机房搬迁,需要重新telnet看看网络是否联通 [weblogic@pays03pre_BankVerify /]$ telnet 172.29.1.159 22Trying 172.29.1.1 ...

  8. 【Django】ORM操作#1

    目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...

  9. ls---显示文件目录各项信息

    ls命令用来显示目标列表,在Linux中是使用率较高的命令.ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件. 语法 ls(选项)(参数) 选项 -a:显示所有档案及目录(ls内定将档案名 ...

  10. 关于Shiro的退出请求是如何关联到登录请求的思考

    一.结论 先给出结论,是因为本身是很简单的道理.假设我们没有使用任何认证授权的框架,就简单的使用Cookie和HttpSession,那么用户登录后的每一个请求是如何关联上这个用户的呢?答案很简单,由 ...