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]双倍回文——回文自动机
题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...
随机推荐
- File的getPath()和getAbsolutePath()和getCanonicalPath()的差别
这几个方法是有一次无意的发现,我当时也不知道什么意思,就百度了,查到了一些列子: 原文地址http://www.blogjava.net/dreamstone/archive/2007/08/08/1 ...
- CF 558A(Lala Land and Apple Trees-暴力)
A. Lala Land and Apple Trees time limit per test 1 second memory limit per test 256 megabytes input ...
- Android入门篇(一)Androidproject的搭建,导入与导出,图标的改动
先说一些题外话吧.这是小珂同学的处女作.可能写的不好,请各位读者见谅.我先讲讲我为什么要写博文,那应该也是机缘巧合,有一次.我问学长一个问题,学长发了一个连接给我,里面是一篇博客.那时我仅仅是看 ...
- MySQL 使用自增ID主键和UUID 作为主键的优劣比較具体过程(从百万到千万表记录測试)
主键类型 SQL语句 运行时间 (秒) (1)模糊范围查询1000条数据,自增ID性能要好于UUID 自增ID SELECT SQL_NO_CACHE t.* FROM test.`UC_US ...
- SpringMVC中JSP取不到ModelAndView的数据原因
自己搭的项目突然EL表达式取不到值了 不管是用 ${msg} 还是用JSTL的<c:out value="${msg}"/> 都不行 才发现犯了一个平时不会注意的错误 ...
- Gym - 100203I I WIN 网络流
Gym - 100203I I WIN 题意:一个n*m的矩阵包含W,I,N三种字符,问相邻的字符最多能组成不重叠的WIN. 思路:比赛的时候没有发现是网络流,,居然一度以为是二分图匹配,,写了一下 ...
- OPENCV(1)
VS 程序的默认路径是源码所在路径(所以图片应该放在此处),而不是Debug路径 OpenCV 模块结构: core--定义了基本数据结构,包括最重要的Mat和一些其他的模块 imgproc--该 ...
- PHP date()获取某时间段以周、月、季度为粒度的时间段数组
date()函数: PHP date() 参考:https://www.hi-docs.com/php/date.html Linux date()参考:http://www.cnblogs.com ...
- COWRUN
USACO COWRUN 随机化搜索+双重递归调用 题面描述:给出8*N(<=14)组牌,每次按顺序选择8张,FJ可以选择前4张或者后4张,COW从FJ选出的牌中选择前两张或者后两张,然后COW ...
- Nginx缩略图和Fastdfs整合以及image_filter配置,7点经验结论和5个参考资料
以下是7点经验结论和5个参考资料 1.Nginx单独配置缩略图与Nginx和Fastdfs模块整合,配置是不一样的. 非整合模式的配置,类似这样的: location ~* /(\d+)\.(jpg ...