后缀树(BZOJ3238TLE)
#include<cstdio>
#include<cstring>
#define LL long long char st[],stt[];
LL ans;
int leafr,ndcnt=,sidcnt,lastcre;
int isleaf[],dep[],nd[],l[],r[],des[],
next[],sufchain[]; int getr(int sid){
if (isleaf[des[sid]]) return(leafr);else return(r[sid]);
} void cut(int po,int sid,int len){
dep[++ndcnt]=dep[po]+len;
isleaf[ndcnt]=; nd[ndcnt]=++sidcnt;
des[sidcnt]=des[sid];
l[sidcnt]=len+l[sid];r[sidcnt]=getr(sid);next[sidcnt]=-;des[sidcnt]=des[sid];
des[sid]=ndcnt;r[sid]=len+l[sid]-;
} void ins(int po,int alph){
dep[++ndcnt]=dep[po]+;
isleaf[ndcnt]=;
nd[ndcnt]=-; l[++sidcnt]=alph;r[sidcnt]=alph;
des[sidcnt]=ndcnt;next[sidcnt]=nd[po];nd[po]=sidcnt;
} void buildtree(){
int po=,lastins=;nd[]=-;sufchain[]=;int prom=; for (int i=;i<=strlen(st)-;i++){
leafr=i;int p,flag;
prom=; while (lastins<=i){ while(){
flag=;
for (p=nd[po];p!=-;p=next[p])
if (st[l[p]]==st[lastins+dep[po]]) break; if (p==-){ins(po,i);
if (prom) sufchain[lastcre]=po;
prom=;
lastcre=po;
break;}
if (i-lastins+-dep[po]<=getr(p)-l[p]+){
if (st[i]==st[l[p]+i-lastins-dep[po]])
{flag=;
if (prom) sufchain[lastcre]=po;
prom=;
lastcre=po;
break;}
if (st[i]!=st[l[p]+i-lastins-dep[po]]) {
cut(po,p,i-lastins-dep[po]);
if (prom) sufchain[lastcre]=ndcnt;
if (i-lastins-dep[po]>) prom=;else prom=;
lastcre=ndcnt;sufchain[lastcre]=;
ins(ndcnt,i);break;
}
}
if (i-lastins+-dep[po]>getr(p)-l[p]+) po=des[p];
}
if (flag) {break;}
po=sufchain[po];lastins++;
}
}
} int top=;
struct str{
int po,fr;
LL cnt,len;
}sta[]; void pb(int ps,int le,int p){
sta[++top].po=p;sta[top].len=le;sta[top].fr=ps;
sta[top].cnt=;
} void pop(){
if (isleaf[sta[top].po]) sta[top].cnt++;
sta[sta[top].fr].cnt+=sta[top].cnt;
top--;
} void getans(){
pb(,,);top=; int i=;
while (top>=i){
int tp=i;
for (int p=nd[sta[tp].po];p!=-;p=next[p])
pb(tp,getr(p)-l[p]+,des[p]);
i++;
} while(top){
ans-=sta[top].len*sta[top].cnt*(sta[top].cnt-);
pop();
}
} int main(){
scanf("%s",stt); LL len=strlen(stt);ans=(len-)*len*(len+)/; st[]=' ';
strcat(stt,"$");strcat(st,stt); buildtree(); getans(); printf("%lld",ans);
}
注意某一个串对应点到后缀树根的深度是$O(n \cdot \sqrt{n})$的
后缀树(BZOJ3238TLE)的更多相关文章
- 后缀树(suffix tree)
参考: 从前缀树谈到后缀树 后缀树 Suffix Tree-后缀树 字典树(trie树).后缀树 一.前缀树 简述:又名单词查找树,tries树,一种多路树形结构,常用来操作字符串(但不限于字符串), ...
- 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...
- 后缀树系列一:概念以及实现原理( the Ukkonen algorithm)
首先说明一下后缀树系列一共会有三篇文章,本文先介绍基本概念以及如何线性时间内构件后缀树,第二篇文章会详细介绍怎么实现后缀树(包含实现代码),第三篇会着重谈一谈后缀树的应用. 本文分为三个部分, 首先介 ...
- 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树
另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...
- [转载]字典树(trie树)、后缀树
(1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...
- 后缀树(Suffix Tree)
问题描述: 后缀树(Suffix Tree) 参考资料: http://www.cppblog.com/yuyang7/archive/2009/03/29 ...
- 关于广义后缀树(多串SAM)的总结
之前我们给的SAM的例题,基本上是一个串建SAM的就能做的 如果要建多个串的SAM应该怎么做呢 首先看题,bzoj2780 我一开始的想法是SA以前的弄法,把串拼起来,中间加分隔符做SAM 这题确实可 ...
- 康复计划#1 再探后缀自动机&后缀树
本篇口胡写给我自己这样的东西都忘光的残废选手 以及那些刚学SAM,看了其他的一些东西并且没有完全懵逼的人 (初学者还是先去看有图的教程吧,虽然我的口胡没那么好懂,但是我觉得一些细节还是讲清楚了的) 大 ...
- 广义后缀树(GST)算法的简介
导言 最近软件安全课上,讲病毒特征码的提取时,老师讲了一下GST算法.这里就做个小总结. 简介 基本信息 广义后缀树的英文为Generalized Suffix Tree,简称GST. 算法目的 ...
- BZOJ 3879: SvT [虚树 后缀树]
传送门 题意: 多次询问,给出一些后缀,求两两之间$LCP$之和 哈哈哈哈哈哈哈竟然$1A$了,刚才还在想如果写不好这道题下节数学就不上了,看来是上天让我上数学课啊 $Suffix\ Virtual\ ...
随机推荐
- 利用网络流传的WebShell默认密码库寻找WebShell
声明:本文提到的技术,仅可用作网络安全加固等合法正当目的.本文作者无法鉴别判断读者阅读本文的真实目的,敬请读者在本国法律所允许范围内阅读本文,读者一旦因非法使用本文提到技术而违反国家相关的法律法规,所 ...
- CTO和技术副总裁应该如何分工?谁才是技术领导者?
谁是初创公司的技术领导者,是CTO还是技术副总裁?任何在创业公司工作的人都知道,我们不应该去问这个问题.因为这两个是非常不同的角色,角色本身会随着创业公司的发展而变化,两者对于业务规模都很重要. 简单 ...
- java设计模式之抽象工厂模式
上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...
- leetcode-Count Primes 以及python的小特性
题目大家都非常熟悉,求小于n的所有素数的个数. 自己写的python 代码老是通不过时间门槛,无奈去看了看大家写的code.下面是我看到的投票最高的code: class Solution: # @p ...
- 虚拟机VMware怎么完全卸载干净
虚拟机VMware怎么完全卸载干净 听语音 | 浏览:19929 | 更新:2014-12-21 10:28 | 标签:虚拟机 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师傅高质屏和好师傅 ...
- 任务调度开源框架Quartz动态添加、修改和删除定时任务
Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触发器监听.你可以配置作业和触发器监听为全局监听或者是特定于 ...
- 获取assemblies信息in .net core
using System; using System.Linq; using System.Reflection; using System.Runtime.Loader; using Microso ...
- win2008server R2 x64 部署.net core到IIS上出现【Failed to load the dll from [C:\Program Files\dotnet\host\fxr\1.0.1\hostfxr.dll], HRESULT: 0x80070057】错误
win2008server R2 x64 部署.net core到IIS上出现[Failed to load the dll from [C:\Program Files\dotnet\host\fx ...
- jquery无缝间歇向上滚动(间断滚动)
jquery无缝间歇向上滚动 JS部份 $(function(){ var $this = $(".renav"); var scrollTimer; $this.hover(fu ...
- memcached的图形界面监控
前提是已经安装了php和memcached 图形界面的监控是通过memcache.php来实现的, 1.把该php程序拷贝到apache的web根目录 [root@cacti srv]# ...