博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】3238: [Ahoi2013]差异
阅读量:6829 次
发布时间:2019-06-26

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

【题意】给定长度为n的小写字母字符串,令Ti表示以i开头的后缀,求Σ[Ti+Tj-2*lcp(Ti,Tj)],1<=i<j<=n。

【算法】后缀自动机

【题解】Σ(Ti+Tj)只与n有关,那么关键在于计算Σ2*lcp(Ti,Tj)。

对逆序串建后缀自动机,其parent树就是原串的后缀树,lcp(Ti,Tj)就是两个后缀在后缀树上的LCA。

那么每个节点的贡献是:2*C(Right(x),2)*Len(x),Right集合的计算先把所有的后缀节点(即每次的np)赋值为1,然后dfs即可。

也可以不用组合数,考虑实际意义——每个节点的贡献是:(Right(x)^2-ΣRight(y)^2)*Len(x),y=son(x),如果x自己是后缀节点括号里再-1,这是从每个Right要在此节点和其它Right结合的思想。

SAM记得双倍空间。

#include
#include
#include
#define ll long longusing namespace std;const int maxn=1000010;//struct tree{
int len,fa,t[30];}t[maxn];struct edge{
int v,from;}e[maxn*2];int last,n,tot=0,root,cnt,first[maxn];ll f[maxn],ans=0;bool mark[maxn];char s[maxn];void insert(int c){ int np=++tot; t[np].len=t[last].len+1; f[np]=1; int x=last; while(x&&!t[x].t[c])t[x].t[c]=np,x=t[x].fa; last=np; if(!x)t[np].fa=root;else{ int y=t[x].t[c]; if(t[y].len==t[x].len+1)t[np].fa=y;else{ int nq=++tot; t[nq]=t[y]; t[nq].len=t[x].len+1; t[nq].fa=t[y].fa;t[y].fa=t[np].fa=nq; while(x&&t[x].t[c]==y)t[x].t[c]=nq,x=t[x].fa; } }}void ins(int u,int v){cnt++;e[cnt].v=v;e[cnt].from=first[u];first[u]=cnt;}void dfs(int x){ ll sum=f[x]*f[x]; for(int i=first[x];i;i=e[i].from){ dfs(e[i].v); f[x]+=f[e[i].v]; sum+=f[e[i].v]*f[e[i].v]; } ans+=(f[x]*f[x]-sum)*t[x].len;}int main(){ scanf("%s",s+1);n=strlen(s+1); root=tot=last=1; for(int i=n;i>=1;i--)insert(s[i]-'a'); for(int i=2;i<=tot;i++)ins(t[i].fa,i); dfs(root); ll sum=0; for(int i=1;i
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/8124077.html

你可能感兴趣的文章
Lync Server 2010的部署系列(四) outlook无法加入联机会议
查看>>
Windows Server 2012安装SQL 2012
查看>>
MS UC 2013-0-虚拟机-标准化-部署-2-模板机-制作-5
查看>>
最常用的四种数据分析方法
查看>>
c++学习笔记:类的若干基础问题
查看>>
ubuntu更改sso文件策略
查看>>
业务开发测试HBase之旅三:通过Java Api与HBase交互
查看>>
JS父页面获取子页面返回值
查看>>
鼠标点击主窗体时,模态子窗口是WindowStyle.None时如何闪烁
查看>>
LABJS源码浅析
查看>>
myShellcode
查看>>
Qore Oracle Module 2.2 发布
查看>>
MoonScript 0.2.2 发布,基于 Lua 的脚本语言
查看>>
assertThat使用方法
查看>>
2013年11月11日工商银行笔试总结
查看>>
Qt之问题求助——当VS遇到“向Pro中添加代码”怎么办?
查看>>
使用reserve函数避免vector和string的内存重新分配
查看>>
ADO.NET(内含存储过程讲解)
查看>>
利用TreeView实现C#工具箱效果
查看>>
PyTalk : a Jabber Client un Python using xmpppy and PyQt4
查看>>