【BZOJ 3238】[Ahoi2013]差异 后缀自动机构造后缀树
来源:互联网 发布:股票历史交易数据 编辑:程序博客网 时间:2024/04/30 00:09
关于后缀自动机的学习网上有很多,所以我就只说说为什么后缀自动机可以转成后缀树。
个人觉得比较好的后缀自动机的博客:http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html
图片来源:http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html
当我们构造出了后缀自动机以后(如上图),容易发现每一个节点和他的pre指针指向的节点到根节点之间的字串,他们都有着相同的后缀。而在后缀树当中,我们把所有的后缀压入一个trie树中,为了压缩空间每一条边代表的不仅仅是一个字符,而是一个字符串,同样的,如果两个后缀拥有相同的前缀,就可以公用这段空间。而刚才的后缀自动机中,我们通过pre指针找到了相同的后缀,那么我们将字符串倒过来就好了。而需要注意的是,由于nq指针是虚拟建立的,所以他不能作为后缀节点。
构造出来差不多就是这样啦,绿色节点表示后缀标记(说明走到这里就走完了一个后缀啦),边是一个字符串
dp很好写
#include<cstdio>#include<cstring>#include<iostream>#define LL long long#define maxn 500020*2using namespace std;int son[maxn][26],fail[maxn],size[maxn],head[maxn],len[maxn],cnt=1,last=1,tot=1,rt=1;char s[maxn];LL ans;struct edge{int v,next;}e[maxn*4];void adde(int a,int b){e[cnt].v=b,e[cnt].next=head[a];head[a]=cnt++;}void insert(int x){int p=last,np=++tot,q,nq;size[np]=1,len[np]=len[p]+1;while(p&&!son[p][x])son[p][x]=np,p=fail[p];if(p==0)fail[np]=rt;else{int q=son[p][x];if(len[q]==len[p]+1)fail[np]=q;else{nq=++tot;len[nq]=len[p]+1;memcpy(son[nq],son[q],sizeof(son[q]));fail[nq]=fail[q];fail[np]=fail[q]=nq;while(p&&son[p][x]==q)son[p][x]=nq,p=fail[p];}}last=np;}void dfs(int u,int fa){for(int v,i=head[u];i;i=e[i].next){dfs(v=e[i].v,u);size[u]+=size[v];}if(u==1)return;len[u]-=len[fa];ans-=(LL)len[u]*size[u]*(size[u]-1);}int main(){scanf("%s",s);int l=strlen(s);for(int i=l-1;i>=0;i--)insert(s[i]-'a');ans=(LL)l*(l-1)*(l+1)>>1ll;for(int i=2;i<=tot;i++)adde(fail[i],i);dfs(1,0);printf("%lld",ans);return 0;}
0 0
- 【BZOJ 3238】[Ahoi2013]差异 后缀自动机构造后缀树
- BZOJ 3238 AHOI2013 差异 后缀自动机
- bzoj 3238: [Ahoi2013]差异 后缀自动机
- BZOJ 3238 [Ahoi2013]差异 后缀自动机
- bzoj 3238: [Ahoi2013]差异 后缀树
- [后缀自动机 构建后缀树 树形DP] BZOJ 3238 [Ahoi2013]差异
- [Ahoi2013]差异 后缀自动机
- bzoj 3238: [Ahoi2013]差异 (后缀自动机+树形dp)
- [后缀自动机][树形DP] BZOJ 3238: [Ahoi2013]差异
- 【BZOJ3238】【Ahoi2013】差异 后缀自动机
- [BZOJ3238] [AHOI2013] 差异 - 后缀自动机
- bzoj3238 [Ahoi2013]差异 后缀自动机
- bzoj 3238: [Ahoi2013]差异 后缀数组
- BZOJ 3238: [Ahoi2013]差异 后缀数组
- bzoj 3238 ahoi2013差异 后缀数组
- BZOJ 3238 差异 [后缀自动机]
- [BZOJ3238][Ahoi2013][后缀自动机][树形DP]差异
- BZOJ 3238 [Ahoi2013]差异 后缀数组+单调栈
- Eclipse启动项目,查看log4j日志
- JVM调优总结
- 合并两个排序的链表
- 堆排序之java
- Spring-data-jpa生成表格失败的可能原因
- 【BZOJ 3238】[Ahoi2013]差异 后缀自动机构造后缀树
- Nordic-GPIO配置:初始化以及中断配置
- ORACLE 11gR2 RAC添加控制文件
- spring mvc通过@ResponseBody返回时,ajax接收显示问号(?)
- Cent OS unzip/zip文件到指定目录
- ubuntu使用virtualenv切换python环境
- 解决CSS垂直居中的几种方法(基于绝对定位,基于视口单位,Flexbox方法)
- 工作笔记
- 2017年云计算大会盘点 看看哪些云计算大会适合自己?