luogu3426 [POI2005]SZA-Template 后缀树
链接
bzoj不能auto
https://www.luogu.org/problemnew/show/P3426
思路
这个要求的串一定是S的前缀和S的后缀。
转化一下
建立出来fail树(fail[i]->i的树)
答案就在0和n之间的链条上,且答案在分界点上(上面全不可以,下面全可以)
这是样例的fail树

好了,我们从0到n挨着判断一下,n^2
其实满足条件就等价于我们选的这个前缀这个答案可以全部覆盖S串
就是说相邻的两个含有T的前缀串串的差<=|T|(这些串串一定在判断字符的子树内)
而且每次向下走的时候都要删除掉不是他子树内的点(因为他们不含有判定字符的前缀)
我们可以在删除的时候用链表维护子树内相邻的串的最大值
而且每个前缀只会被删一次,复杂度O(n)
错误
有点复杂度错误
bzoj不能auto、、、、
代码
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+7;
int n,fail[N],head=1,vis[N],ma=1;
char s[N];
vector<int> G[N];
struct node {int las,u,nxt;}e[N];
void del(int u) {
if(vis[u]) return;
e[e[u].las].nxt=e[u].nxt;
e[e[u].nxt].las=e[u].las;
if(e[e[u].nxt].u&&e[e[u].las].u)
ma=max(ma,e[e[u].nxt].u-e[e[u].las].u);
// for(auto v:G[u]) del(v);
// for(int v=0;v<G[u].size();++v) del(v);
for(vector<int>::iterator v=G[u].begin();v!=G[u].end();++v) del(*v);
}
void dfs(int u) {
vis[u]=0;
if(u>=ma) {printf("%d\n",u);exit(0);}
del(u);
// for(auto v:G[u])if(vis[v])dfs(v);
// for(int v=0;v<G[u].size();++v) if(vis[v])dfs(v);
for(vector<int>::iterator v=G[u].begin();v!=G[u].end();++v) if(vis[*v])dfs(*v);
}
int main() {
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
scanf("%s",s+1);
n=strlen(s+1);
for(int i=2,p=0;i<=n;++i) {
while(p>0&&s[i]!=s[p+1]) p=fail[p];
if(s[i]==s[p+1]) p++;
fail[i]=p;
}
for(int i=1;i<=n;++i) G[fail[i]].push_back(i),cout<<fail[i]<<" "<<i<<"\n";
for(int p=n;p;p=fail[p]) vis[p]=1;
for(int i=1;i<=n;++i) e[i].las=i-1,e[i].nxt=i+1,e[i].u=i;e[n].nxt=0;
dfs(0);
return 0;
}
luogu3426 [POI2005]SZA-Template 后缀树的更多相关文章
- 洛谷P5284 [十二省联考2019]字符串问题 [后缀树]
传送门 思路 设\(dp_i\)表示以\(i\)结尾的\(A\)串,能达到的最长长度. 然后发现这显然可以\(i\)往自己控制的\(k\)连边,\(k\)往能匹配的\(j\)连边,就是个最长路,只要建 ...
- [CTSC2010]珠宝商 SAM+后缀树+点分治
[CTSC2010]珠宝商 不错的题目 看似无法做,n<=5e4,8s,根号算法? 暴力一: n^2,+SAM上找匹配点的right集合sz,失配了直接退出 暴力二: O(m) 统计过lca=x ...
- LOJ6041. 「雅礼集训 2017 Day7」事情的相似度 [后缀树,LCT]
LOJ 思路 建出反串的后缀树,发现询问就是问一个区间的点的\(lca\)的深度最大值. 一种做法是dfs的时候从下往上合并\(endpos\)集合,发现插入一个点的时候只需要把与前驱后继的贡献算进去 ...
- CF gym 100962D Deep Purple [后缀树,树链剖分,线段树]
Codeforces 思路 感觉这个离线的思路好神仙啊qwq 对于每个询问\([l,r]\)其实就是要求\(p_{max}\),使得\(lcs(s[1,p],s[1,r])>p-l\),也就是\ ...
- 后缀树(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 ...
随机推荐
- PHP中多维数组var_dump展示不全
转载于http://blog.csdn.net/Merlin_feng/article/details/51733354
- linux的基本操作(LAMP环境搭建)
LAMP 环境搭建 经过前部分章节的学习,你已经掌握了linux的基础知识了.但是想成为一名系统管理员恐怕还有点难度,因为好多单位招聘这个职位的时候都要求有一定的工作经验.然而真正的经验一天两天是学不 ...
- ubantu中怎样安装VMware Tools
点击虚拟机选择安装VMware tools tar zxvf VMwareTools-9.6.0-1294478.tar.gz -C /root/(安装到的目录)cd /root/cd vmware- ...
- python全栈开发 * 进程池,线程理论 ,threading模块 * 180727
一.进程池 (同步 异步 返回值) 缺点: 开启进程慢 几个CPU就能同时运行几个程序 进程的个数不是无线开启的 应用: 100个任务 进程池 如果必须用多个进程 且是高计算型 没有IO型的程序 希望 ...
- python全栈开发 * 10知识点汇总 * 180612
10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...
- spfa最短路径
C++代码 #include <iostream> #include <deque> #include <stack> #include <vector> ...
- 执行效率做比较,Go、python、java、c#、delphi、易语言等
比较环境,在win7 64位,比较各种语言的整数型运算,下面的比较只作为单项比较.具体方式,40000*40000遍历相加.为了防止编译器优化,生成一个随机数. 1:c#,在NET2.0框架下作为 ...
- 图->连通性->关节点和重连通分量
文字描述 相关定义:假若在删去顶点v以及和v相关联的各边之后,将图的一个连通分量分割成两个或两个以上的连通分量,则称顶点v为该图的一个关节点.一个没有关节点的连通图称为重连通图. 在重连通图上,任意一 ...
- iptables 分析(三)
原文:http://blog.chinaunix.net/uid-24207747-id-2622902.html find_target查到目标并加载成功,返回一个xtables_target型对象 ...
- IE、360浏览器select属性onchange遇到的坑
在网页头部定义js代码 <script type="text/javascript"> function gradeChange(e){ var selectId = ...