#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)的更多相关文章

  1. 后缀树(suffix tree)

    参考: 从前缀树谈到后缀树 后缀树 Suffix Tree-后缀树 字典树(trie树).后缀树 一.前缀树 简述:又名单词查找树,tries树,一种多路树形结构,常用来操作字符串(但不限于字符串), ...

  2. 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

    涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...

  3. 后缀树系列一:概念以及实现原理( the Ukkonen algorithm)

    首先说明一下后缀树系列一共会有三篇文章,本文先介绍基本概念以及如何线性时间内构件后缀树,第二篇文章会详细介绍怎么实现后缀树(包含实现代码),第三篇会着重谈一谈后缀树的应用. 本文分为三个部分, 首先介 ...

  4. 【Todo】字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树

    另开一文分析字符串相关的各种算法,以及用到的各种数据结构,包括前缀树后缀树等各种树. 先来一个汇总, 算法: 本文中提到的字符串匹配算法有:KMP, BM, Horspool, Sunday, BF, ...

  5. [转载]字典树(trie树)、后缀树

    (1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...

  6. 后缀树(Suffix Tree)

          问题描述:               后缀树(Suffix Tree)   参考资料: http://www.cppblog.com/yuyang7/archive/2009/03/29 ...

  7. 关于广义后缀树(多串SAM)的总结

    之前我们给的SAM的例题,基本上是一个串建SAM的就能做的 如果要建多个串的SAM应该怎么做呢 首先看题,bzoj2780 我一开始的想法是SA以前的弄法,把串拼起来,中间加分隔符做SAM 这题确实可 ...

  8. 康复计划#1 再探后缀自动机&后缀树

    本篇口胡写给我自己这样的东西都忘光的残废选手 以及那些刚学SAM,看了其他的一些东西并且没有完全懵逼的人 (初学者还是先去看有图的教程吧,虽然我的口胡没那么好懂,但是我觉得一些细节还是讲清楚了的) 大 ...

  9. 广义后缀树(GST)算法的简介

    导言 最近软件安全课上,讲病毒特征码的提取时,老师讲了一下GST算法.这里就做个小总结. 简介 基本信息  广义后缀树的英文为Generalized Suffix Tree,简称GST. 算法目的   ...

  10. BZOJ 3879: SvT [虚树 后缀树]

    传送门 题意: 多次询问,给出一些后缀,求两两之间$LCP$之和 哈哈哈哈哈哈哈竟然$1A$了,刚才还在想如果写不好这道题下节数学就不上了,看来是上天让我上数学课啊 $Suffix\ Virtual\ ...

随机推荐

  1. Keepalived+MySQL双主架构

    l  架构准备 Node1 192.168.15.3 Node2 192.168.15.4 VIP 192.168.15.254 l  软件 MySQL 5.6 Keepalive yum insta ...

  2. js 数组删除指定元素

    Array.prototype.remove = function(obj) { for (var i = 0; i < this.length; i++) { var temp = this[ ...

  3. SQL Serve里你总要去改变的3个配置选项

    你用安装向导安装了全新的SQL Server,最后你点击了完成按钮.哇噢~~~现在我们可以把我们的服务器进入生产了!抱歉,那并不是真的,因为你的全新SQL Server默认配置是错误的. 是的,你没看 ...

  4. 常用的js跳转页面方法实现汇总

    1.window.location.href方式 <script language="javascript" type="text/javascript" ...

  5. C#设计模式(21)——责任链模式

    一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所 ...

  6. python基础(五)缩进和选择

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例. ...

  7. Fragment中添加ListView而不使用ListFragment

    最初的构想是,将Fragment和ViewPager结合起来, 然后突发奇想,在第一个Fragment里添加了ListView, 依照网上的建议,extends了ListFragment,接着各种报错 ...

  8. 在Docker中运行web应用

    启动一个简单的web 应用 使用社区提供的模板,启动一个简单的web应用,熟悉下各种Docker命令的使用: # docker run -d -P training/webapp python app ...

  9. 《MySchool数据库设计优化》内部测试

    1) 在SQL Server 中,为数据库表建立索引能够( C ). A. 防止非法的删除操作 B. 防止非法的插入操作 C. 提高查询性能 D. 节约数据库的磁盘空间 解析:索引的作用是通过使用索引 ...

  10. 《你不常用的c#之二》:略谈GCHandle

    我们在使用c#托管代码时,内存地址和GC回收那不是我们关心的,CLR已经给我们暗箱操作.但是如果我们在c#中调用了一个非托管代码,比如vc的DLL,而且他有个回调函数,需要引用c#中的某个对象并操作, ...