CF17E Palisection(回文自动机)
题意翻译
给定一个长度为n的小写字母串。问你有多少对相交的回文子 串(包含也算相交) 。 输入格式
第一行是字符串长度n(1<=n<=2*10^6),第二行字符串 输出格式
相交的回文子串个数%51123987
题解
直接判断相交的回文串很难
那我们考虑找出所有不相交的回文串
数量就是所有以$i$结尾的回文串数乘以$i$后面的回文串数
以$i$结尾的回文串数就是在fail树里$i$的深度
然后$i$后面的回文串数只要倒着做一遍再记录一个后缀和就好了
然后记$sum$为总共的回文串数,回文串对数就是$sum*(sum-1)/2$
然后减一减就好了
//minamoto
#include<cstring>
#include<cstdio>
const int N=2e6+,P=;
int head[N],Next[N],ver[N],edge[N],E;
int len[N],fail[N],cnt[N],dep[N],suf[N],p,q,tot,last;
char s[N],ss[N];
int n,m,sum,ans;
inline int pls(int x,int y){return x+=y,x>=P?x-P:x;}
inline int sub(int x,int y){return x-=y,x<?x+P:x;}
inline int newnode(int x){
len[++tot]=x;return tot;
}
inline int getfail(int x,int n){
while(s[n-len[x]-]!=s[n]) x=fail[x];return x;
}
inline void init(){
s[]=-,fail[]=,last=n=;
len[]=,len[]=-,tot=,E=;
memset(cnt,,sizeof(cnt));
}
inline void add(int u,int v,int e){
ver[++E]=v,Next[E]=head[u],head[u]=E,edge[E]=e;
}
inline int get(int u,int e){
for(int i=head[u];i;i=Next[i])
if(edge[i]==e) return ver[i];return ;
}
int ins(int c){
s[++n]=c,p=getfail(last,n);
if(!get(p,c)){
q=newnode(len[p]+);
fail[q]=get(getfail(fail[p],n),c);
add(p,q,c),dep[q]=dep[fail[q]]+;
}
++cnt[last=get(p,c)];return dep[last];
}
inline int calc(){
int res=;
for(int i=tot;i>=;--i)
res=pls(res,cnt[i]),cnt[fail[i]]+=cnt[i];
return res;
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%s",&m,ss+);
init();for(int i=m;i;--i) suf[i]=pls(suf[i+],ins(ss[i]-'a'));
memset(head,,sizeof(head));
init();for(int i=;i<=m;++i) ans=pls(ans,1ll*ins(ss[i]-'a')*suf[i+]%P);
sum=calc();
sum=1ll*sum*(sum-)/%P;
printf("%d\n",sub(sum,ans));
return ;
}
CF17E Palisection(回文自动机)的更多相关文章
- CF17E Palisection (回文自动机+DP)
题目传送门 题目大意:给你一个字符串,让你求出有多少对相交的回文子串 啊啊啊啊降智了,我怎么又忘了正难则反! 求相交会很难搞.把问题转化成求互不相交的回文子串再减一下就行了 先利用$PAM$求出以每个 ...
- 回文树/回文自动机(PAM)学习笔记
回文树(也就是回文自动机)实际上是奇偶两棵树,每一个节点代表一个本质不同的回文子串(一棵树上的串长度全部是奇数,另一棵全部是偶数),原串中每一个本质不同的回文子串都在树上出现一次且仅一次. 一个节点的 ...
- 回文树(回文自动机PAM)小结
回文树学习博客:lwfcgz poursoul 边写边更新,大概会把回文树总结在一个博客里吧... 回文树的功能 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀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]双倍回文——回文自动机
题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...
随机推荐
- c/c++写的比较好的读写配置文件的函数或者类
共用版 .h文件 //---------------------------------------------------------------------------- // 程序名称: ...
- 关于对H264码流的PS的封装的相关代码实现
1.写在开始之前: 最近因为新工作要维护别人留下的GB模块代码,先熟悉了流程,然后也试着封装了下ps流,结果也能通过测试正常预览了,当然,其中开发读文档的头疼,预览花屏,卡帧的事情都有遇到,当时慢慢的 ...
- bzoj 4773: 负环 floyd
题目: 对于边带权的有向图,找出一个点数最小的环,使得环上的边权和为负. 2 <= n <= 300. 题解: 我们可以考虑从小到大枚举答案. 然后每次枚举更大的答案的时候就从当前的较小的 ...
- EF中调整字段的顺序
EF中设计数据库表结构时,在Designer UI中无法调整添加好的字段顺序. 方法: 1.在Solution Explorer中右击XXX.edmx文件, 选择"Open With&quo ...
- 创建Azure Blob Snapshot的脚本
在前面的文章中介绍了如何创建Azure Blob Snapshot.那篇文章中创建的脚本思路是:遍历所有Storage Account,找到所有vhd文件,进行Snapshot的创建. 但这种方式不够 ...
- HDOJ1059(多重背包)
1.解法一:多重背包 #include<iostream> #include<cstdio> using namespace std; #define MAX(a,b) (a& ...
- Linux编程里getopt_long_only函数用法详解
在程序中难免需要使用命令行选项,可以选择自己解析命令行选项,但是有现成的,何必再造轮子.下面介绍使用getopt_long_only和getopt_long(两者用法差不多)解析命令行选项. 程序中主 ...
- php-fpm包的安装与配置
实验环境:CentOS7 [root@~ localhost]#yum -y install php-fpm php-fpm包:用于将php运行于fpm模式 #在安装php-fpm时,一般同时安装如下 ...
- Date---String is 合法的date 方法---
package com.etc.jichu; import java.text.SimpleDateFormat; public class IsDate { public static boolea ...
- CentOS配置LDAP服务器
环境:centos 5.8 安装: 1.yum安装oepnldap.openldap-servers.openldap-clients.openldap-devel [root@hao-linux ~ ...