#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. linux的“自动化”

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  2. Java设计模式学习笔记(观察者模式)

    观察者模式说起来很简单,就是一个订报纸的模式.但是实际上这部分我觉得还是很有意思的,<Head First设计模式>里还有一些还没看完,也是因为理解的不够深吧. 观察者模式会包含两个组件: ...

  3. win7下Qt5使用mysql C++编程配置

    先下载mysql的库文件链接:http://files.cnblogs.com/files/xiaobo-Linux/mysql.zip 把两个文件放入 Qt目录\Qt5.5.0\5.5\mingw4 ...

  4. Apache

    一.简介 Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速.可靠并且可通过简单的A ...

  5. Codeforces 486E LIS of Sequence --树状数组求LIS

    题意: 一个序列可能有多个最长子序列,现在问每个元素是以下三个种类的哪一类: 1.不属于任何一个最长子序列 2.属于其中某些但不是全部最长子序列 3.属于全部最长子序列 解法: 我们先求出dp1[i] ...

  6. poj 3468

    A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 90736 Acc ...

  7. 协议的分用以及wireshark对协议的识别

    在TCP/IP详解一书中谈到了协议的分用,书中的图1-8如上.图1-8可以很好地解释在互联网的分层结构中,底层的协议头是如何承载上层的不同的协议的.对于链路层而言,以太网首部中有不同帧类型用于表示以太 ...

  8. cocos 锚点、包围盒

    cocos中,setPosition就是设置一个sprite的锚点在父级元素的坐标 默认锚点是sprite矩形的中点 可以用getBoundingBox返回一个sprite所占矩形范围.范围用Rect ...

  9. 关于oracle with as用法

    with as语法–针对一个别名with tmp as (select * from tb_name) –针对多个别名with   tmp as (select * from tb_name),   ...

  10. C#几个经常用到的字符串截取

    C#几个经常用到的字符串截取 一. 1.取字符串的前i个字符 (1)string str1=str.Substring(0,i); (2)string str1=str.Remove(i,str.Le ...