博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ.3238.[AHOI2013]差异(后缀自动机 树形DP/后缀数组 单调栈)
阅读量:4591 次
发布时间:2019-06-09

本文共 1783 字,大约阅读时间需要 5 分钟。

\(Description\)

1(4).jpg

\(Solution\)

len(Ti)+len(Tj)可以直接算出来,每个小于n的长度会被计算n-1次。

\[\sum_{i=1}^n\sum_{j=i+1}^n i+j = (n-1)*\sum_{i=1}^n = (n-1)*\frac{n*(n+1)}{2}\]

对于后半部分:

SAM:求后缀的LCP,我们可以想到将字符串反转,求前缀的最长公共后缀。

parent树上每个叶子节点都对应一个前缀,两个节点间的最长公共后缀在它们的LCA处,长度为len[LCA]。
于是对于每个节点我们统计有多少对叶子节点的LCA为它。树形DP就可以了。
非后缀节点的size是等于0,但是最后一样DP。

SA:LCP当然是看height了。枚举后缀,计算它与之前串所构成的LCP。

如果ht[i]>=ht[i-1],那么它与之前串的LCP和i-1一样;否则ht[i]就是这部分的LCP长度。
用单调栈维护离i最近且ht[p]<=i的位置p,则f[i]=f[p]+(i-p)*ht[i]。

//122404kb  1924ms#include 
#include
#include
const int N=1e6+5;struct Suffix_Automaton{ int n,las,tot,fa[N],son[N][26],len[N],sz[N],A[N],tm[N]; char s[N>>1]; void Insert(int c) { int p=las,np=++tot; len[las=np]=len[p]+1, sz[np]=1; for(; p&&!son[p][c]; p=fa[p]) son[p][c]=np; if(!p) fa[np]=1; else { int q=son[p][c]; if(len[q]==len[p]+1) fa[np]=q; else { int nq=++tot; len[nq]=len[p]+1; memcpy(son[nq],son[q],sizeof son[q]); fa[nq]=fa[q], fa[q]=fa[np]=nq; for(; son[p][c]==q; p=fa[p]) son[p][c]=nq; } } } void Build() { las=tot=1; scanf("%s",s+1), n=strlen(s+1); std::reverse(s+1,s+1+n); for(int i=1; i<=n; ++i) Insert(s[i]-'a'); for(int i=1; i<=tot; ++i) ++tm[len[i]]; for(int i=1; i<=n; ++i) tm[i]+=tm[i-1]; for(int i=1; i<=tot; ++i) A[tm[len[i]]--]=i; long long res=0; for(int i=tot,x=A[i],f; i; x=A[--i]) f=fa[x], res+=1ll*sz[f]*sz[x]*len[f], sz[f]+=sz[x]; printf("%lld\n",1ll*n*(n+1)/2*(n-1)-(res<<1)); }}sam;int main(){ sam.Build(); return 0;}

转载于:https://www.cnblogs.com/SovietPower/p/9249744.html

你可能感兴趣的文章
BZOJ 4260 Codechef REBXOR(字典树)
查看>>
idea使用maven逆向mybitis的文件
查看>>
宿舍助手app——个人工作第二天
查看>>
线段树(hdu 2795)
查看>>
David Sankoff 介绍学习链接
查看>>
当连续进行多个请求,并且请求的url地址相同时。放弃前面的所有请求,只执行最后一次请求。...
查看>>
[IIS]安装及使用
查看>>
[Tizen开发]基于Tizen平台的终端开发模拟器1 - Web
查看>>
Html::a 生成 method=post
查看>>
hbase知识
查看>>
ReactNative--state
查看>>
从别人的博客学习
查看>>
spring4的新特性---泛型注入
查看>>
在linux上安装MySQL数据库,并简单设置用户密码,登录MySQL
查看>>
CallBack
查看>>
Codeforces Round #453
查看>>
第二次试验报告
查看>>
(转载)C# ListView用法详解
查看>>
R语言入门心得(1) -- 下载与安装
查看>>
正则表达式
查看>>