题目传送门

题目大意:给你一个字符串,让你求出有多少对相交的回文子串

啊啊啊啊降智了,我怎么又忘了正难则反

求相交会很难搞。把问题转化成求互不相交的回文子串再减一下就行了

先利用$PAM$求出以每个位置为末尾的回文子串数量,这个数量就是此时构造末尾节点在$fail$树中的深度

再把串翻过来,用同样的方法求出每个位置为开头的回文子串数量

对其中一个数组求前缀和,用乘法原理算一下就行了

空间开不下怎么办?以时间换空间,用邻接表存儿子!每次跳儿子都暴力遍历一次邻接表

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define N1 2000010
using namespace std;
const int p=; template <typename _T> void read(_T &ret)
{
ret=; _T fh=; char c=getchar();
while(c<''&&c>''){ if(c=='-') fh=-; c=getchar(); }
while(c>=''&&c<=''){ ret=ret*+c-''; c=getchar(); }
ret=ret*fh;
}
/*void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){ x=1; y=0; return; }
exgcd(b,a%b,x,y); ll t=x; x=y; y=t-a/b*y;
}*/ int idx(char c){ return c-'a'; } struct Edge{
int to[N1],nxt[N1],val[N1],head[N1],cte;
void ae(int u,int v,int w)
{ cte++; to[cte]=v; nxt[cte]=head[u]; val[cte]=w; head[u]=cte; }
}e; namespace PAM{
int pre[N1],dep[N1],sum[N1],sz[N1],la,tot;
void clr()
{
memset(pre,,sizeof(pre)); memset(dep,,sizeof(dep));
memset(sum,,sizeof(sum)); memset(&e,,sizeof(e));
}
void init(){ la=tot=; pre[]=pre[]=; dep[]=-; }
int same(char *str,int p,int i){ return str[i-dep[p]-]==str[i]; }
int trs(int x,int c)
{
for(int j=e.head[x];j;j=e.nxt[j])
if(e.val[j]==c) return e.to[j];
return ;
}
int insert(char *str,int i)
{
int p=la,np,fp,tp,c=idx(str[i]);
while(!same(str,p,i)) p=pre[p];
if(!(tp=trs(p,c))) //!trs[p][c]
{
np=++tot;
dep[np]=dep[p]+;
fp=pre[p];
while(!same(str,fp,i)) fp=pre[fp];
pre[np]=trs(fp,c); //trs[fp][c]
e.ae(p,np,c); //trs[p][c]=np;
p=np;
}else p=tp;
la=p;
sum[p]=sum[pre[p]]+;
return p;
}
}; int n;
char str[N1];
ll lsum[N1],rsum[N1]; int main()
{
int i,j,x; ll ans=;
scanf("%d",&n);
scanf("%s",str+);
PAM::init();
for(i=;i<=n;i++) x=PAM::insert(str,i), lsum[i]=PAM::sum[x];// ans+=lsum[i];
PAM::clr(); PAM::init();
reverse(str+,str+n+);
for(i=;i<=n;i++) x=PAM::insert(str,i), rsum[i]=PAM::sum[x], rsum[i]+=rsum[i-]; //rsum[i]+=rsum[i-1];
if(rsum[n]&) ans=1ll*((rsum[n]-)/%p)*(rsum[n]%p)%p;
else ans=1ll*(rsum[n]/%p)*((rsum[n]-)%p)%p;
for(i=;i<=n;i++) ans=(ans-1ll*lsum[i-]*rsum[n-i+]%p+p)%p;
printf("%I64d\n",(ans%p+p)%p);
return ;
}

CF17E Palisection (回文自动机+DP)的更多相关文章

  1. bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp)

    bzoj2084/luoguP3501 [Poi2010]Antisymmetry(回文自动机+dp) bzoj Luogu 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一 ...

  2. bzoj4044/luoguP4762 [Cerc2014]Virus synthesis(回文自动机+dp)

    bzoj4044/luoguP4762 [Cerc2014]Virus synthesis(回文自动机+dp) bzoj Luogu 你要用ATGC四个字母用两种操作拼出给定的串: 1.将其中一个字符 ...

  3. 洛谷P4762 [CERC2014]Virus synthesis(回文自动机+dp)

    传送门 回文自动机的好题啊 先建一个回文自动机,然后记$dp[i]$表示转移到$i$节点代表的回文串的最少的需要次数 首先肯定2操作越多越好,经过2操作之后的串必定是一个回文串,所以最后的答案肯定是由 ...

  4. bzoj 4044: [Cerc2014] Virus synthesis【回文自动机+dp】

    建回文自动机,注意到一个回文串是可以通过一个长度小于等于这个串长度的一半的回文串添上一些字符然后复制得到的,也就是在自动机上向fa走,相当于treedp 每次都走显然会T,记录一个up,指向祖先中最下 ...

  5. [CERC2014]Virus synthesis【回文自动机+DP】

    [CERC2014]Virus synthesis 初始有一个空串,利用下面的操作构造给定串 SS . 1.串开头或末尾加一个字符 2.串开头或末尾加一个该串的逆串 求最小化操作数, \(|S| \l ...

  6. BZOJ 4044 Virus synthesis (回文自动机+dp)

    题目大意: 你可以在一个串的开头或者末尾加入一个字符,或者把当前整个串$reverse$,然后接在前面或者后面,求达到目标串需要的最少操作次数 对目标串建出$PAM$ 定义$dp[x]$表示当前在回文 ...

  7. [BZOJ4044]Virus synthesis 回文自动机的DP

    4044: [Cerc2014] Virus synthesis Time Limit: 20 Sec  Memory Limit: 128 MB Description Viruses are us ...

  8. BZOJ 4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)

    好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...

  9. BZOJ 3790 神奇项链(回文自动机+线段树优化DP)

    我们预处理出来以i为结尾的最长回文后缀(回文自动机的构建过程中就可以求出)然后就是一个区间覆盖,因为我懒得写贪心,就写了线段树优化的DP. #include<iostream> #incl ...

随机推荐

  1. LeetCode 739. Daily Temperatures (每日温度)

    题目标签:HashMap 题目给了我们一组温度,让我们找出 对于每一天,要等多少天,气温会变暖.返回一组等待的天数. 可以从最后一天的温度遍历起,从末端遍历到开头,对于每一天的温度,把它在T里面的in ...

  2. 浅谈API网关(API Gateway)如何承载API经济生态链

    序言 API经济生态链已经在全球范围覆盖, 绝大多数企业都已经走在数字化转型的道路上,API成为企业连接业务的核心载体, 并产生巨大的盈利空间.快速增长的API规模以及调用量,使得企业IT在架构上.模 ...

  3. hdu 6119 小小粉丝度度熊(尺取)

    小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  4. 洛谷P2303 [SDOi2012]Longge的问题

    题目背景 SDOi2012 题目描述 Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N). ...

  5. 面试题:InnoDB中一棵B+树能存多少行数据?

    阅读本文大概需要 5 分钟. 作者:李平 | 来源:个人博客 一.InnoDB 一棵 B+ 树可以存放多少行数据? InnoDB 一棵 B+ 树可以存放多少行数据? 这个问题的简单回答是:约 2 千万 ...

  6. 微信小程序压缩图片并上传到服务器(拿去即用)

    这里注意一下,图片压缩后的宽度是画布宽度的一半 canvasToTempFilePath 创建画布的时候会有一定的时间延迟容易失败,这里加setTimeout来缓冲一下 这是单张图片压缩,多张的压缩暂 ...

  7. 接口管理功能全面增强!EOLINKER EPC 5.0.9版本更新:支持LDAP用户系统、加入更多项目统计图表、强化测试/自动化测试功能等

    EOLINKER EPC(Enterprise Private Cloud 企业私有云产品)已于近期发布5.0.9版本:界面全面改版.支持LDAP用户系统.加入更多项目统计图表.强化测试/自动化测试功 ...

  8. mina2 笔记

    http://www.iteye.com/topic/1112123 http://dongxuan.iteye.com/blog/901689 http://scholers.iteye.com/b ...

  9. python django简单操作

    准备: pip3 install  django==1.10.3 cmd django-admin startproject  guest  创建一个guest的项目 cd guest manage. ...

  10. ACM_ZHANGZHANG喜欢手表

    ZHANGZHANG喜欢手表 Time Limit: 2000/1000ms (Java/Others) Problem Description: ZHANGZHANG刚过生日,收到了好朋友NENGN ...