trie上构建后缀数组】的更多相关文章

例题: 往事太多,有时候忘了就忘了吧. 如果有非记不可的,就只能用点附加手段啦! 我们定义一棵往事树是一个 n 个点 n-1 条边的有向无环图,点编号为 1到 n,其中 1 号点被称为是根结点,除根结点以外, 每个点都恰有一条出边(即以其作为起点的边). 每条边上有 1 个字符(这里我们实际上用一个不大于 300的非负整数代表不同的字符), 对于任意一个点 u,u 的所有入边(即以其为终点的边)上的字符互不相同. 接下来我们定义往事,点 u 对应的往事为 u 到根的路径(显然有且只有一条)上的所…
bzoj3926/luoguP3346 [Zjoi2015]诸神眷顾的幻想乡(trie上构建广义后缀自动机) bzoj Luogu 题解时间 给你个无根trie树(你管这叫trie树?),问你选取一条有向路径能形成多少种不同字符串. 太阳花田的结构比较特殊,只与一个空地相邻的空地数量不超过20个.->只有不超过20个叶子. 纯粹看你读题的,你要是读错了这句话的含义你就白给. 如何保证完整枚举这棵树上所有可能的字符串呢? 我们以某个点为根建广义SAM,很明显每一个点都只有向根方向延展出的字符串没有…
后缀树: 字符串匹配算法一般都分为两个步骤,一预处理,二匹配. KMP和AC自动机都是对模式串进行预处理,后缀树和后缀数组则是对文本串进行预处理. 后缀树的性质: 存储所有 n(n-1)/2 个后缀需要 O(n) 的空间,n 为的文本(Text)的长度: 构建后缀树需要 O(dn) 的时间,d 为字符集的长度(alphabet): 对模式(Pattern)的查询需要 O(dm) 时间,m 为 Pattern 的长度: 介绍后缀树之前,我们首先要知道压缩字典树的概念. 我们在对关键字建立字典树的时…
议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长回文串问题,全文搜索等问题: 后缀数组的基本元素: 给定一个string,其长度为L,后缀指的是从string的某一个位置i(0<=i<L)开始到串末尾(string[L-1])的一个子串,表示为suffix(i): L个suffix(i)按照字典顺序排列并顺序存储在一个数组SA[L]中,则SA[…
SvT bzoj-3879 题目大意:给定一个字符串.每次询问给定$t$个位置,求两两位置开头的后缀的$LCP$之和. 注释:$1\le length\le 5\cdot 10^5$,$\sum t\le 3\cdot 10^6$. 想法: 不难想到构建后缀数组. 进而我们的问题就转化成了给定序列上一些位置求这些位置两两之间区间最小值的和. 对$ht$数组建立$ST$表. 接下来的过程可以用单调栈维护. Code: #include <iostream> #include <cstdio…
差异 bzoj-3238 Ahoi-2013 题目大意:求任意两个后缀之间的$LCP$的和. 注释:$1\le length \le 5\cdot 10^5$. 想法: 两个后缀之间的$LCP$和显然不好求. 我们先构建后缀数组. 那么任意两个后缀之间的$LCP$之和就是所有$sa$数组上所有区间的$ht$最小值. 换言之,我们有一个$a$数组. 显然让你求所有区间的权值和. 一个区间的权值为这个区间内所有$a_i$的最小值. 这个过程我们可以用单调栈实现. Code: #include <io…
Given a string, we need to find the total number of its distinct substrings. Input T- number of test cases. T<=20; Each test case consists of one string, whose length is <= 50000 Output For each test case output one number saying the number of disti…
题目:http://codeforces.com/contest/504/problem/E 树链剖分,把重链都接起来,且把每条重链的另一种方向的也都接上,在这个 2*n 的序列上跑后缀数组. 对于询问,把两条链拆成一些重链的片段,然后两个指针枚举每个片段,用后缀数组找片段与片段的 LCP ,直到一次 LCP 的长度比两个片段的长度都小,说明两条链的 LCP 截止于此. 把重链放到序列上其实就是把 dfn 作为序列角标. 不太会实现,就借鉴(抄)了别人的代码.之后要多多回顾. #include<…
Description 墨墨的妈妈热爱炒股,她要求墨墨为她编写一个软件,预测某只股票未来的走势.股票折线图是研究股票的必备工 具,它通过一张时间与股票的价位的函数图像清晰地展示了股票的走势情况.经过长时间的观测,墨墨发现很多股 票都有如下的规律:之前的走势很可能在短时间内重现!如图可以看到这只股票A部分的股价和C部分的股价的走势 如出一辙.通过这个观测,墨墨认为他可能找到了一个预测股票未来走势的方法.进一步的研究可是难住了墨墨, 他本想试图统计B部分的长度与发生这种情况的概率关系,不过由于数据量…
Boring counting \[ Time Limit: 1000 ms \quad Memory Limit: 32768 kB \] 题意 给出一个字符串,求出其中出现两次及以上的子串个数,要求子串之间不可以重合. 思路 对字符串后缀数组,然后枚举子串长度 \(len\),若某一段连续的 \(sa[i]\) 的 \(lcp \geq len\),那么说明这一段内存在一个长度为 \(lcp\) 的子串,而我们只需要其中的前 \(len\) 部分,接下来只要找出这个子串出现的最左和最右位置,…
参考:http://www.mamicode.com/info-detail-1949898.html (log2) https://blog.csdn.net/geotcbrl/article/details/50907662 https://blog.csdn.net/cdsszjj/article/details/79920308 https://blog.csdn.net/ez_yww/article/details/77072632 trie 上后缀数组想做的是把 trie 树每个节点…
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟悉的大概是kmp,即使如此还是有相当一部分人也不理解kmp,更别说其他的了.当然一般的字符串问题中,我们只要用简单的暴力算法就可以解决了,然后如果暴力效率太低,就用个hash.当然hash也是一个面试中经常被用到的方法.这样看来,这样的一些算法和数据结构实际上很少会被问到,不过如果使用它们一般可以得…
先把问题放在后缀数组上考虑 已知两个数组a b,求min(a[i],...,a[j])+(b[i]^b[j])的最大值 套路题 初始每个点都是一个小连通块 把a按从大到小的顺序加入,计算当前加入边作为min的贡献: 每次加入会把两个连通块联通,答案就是两边连通块各出一个数能得到的异或和最大值 我:这不是线性基吗 miaom:mdzz,只能有两个数 我:蛤,好难啊,怎么做啊 miaom:Trie啊 我:哦 没了 #include <bits/stdc++.h> #define N 500001…
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现,不能跨越),以及最后每个人被点到多少次. 分析 这种解法是用后缀数组优化一下暴力,(优化了吗?)复杂度并不能保证,然而能A... 我们先把所有名,姓,点名串都接在一个串里面. 然后匹配问题就转化成了后缀的最长公共前缀问题. 但是由于我们讨论问题的对象是名,姓,以及点名串,所以每个部分我们用不同的分隔…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2754 [题意] 每只喵有名姓,如果被老师点到名或姓的子串都要答道,但每只喵一次点名只答一次,问每次有多少只喵答道,以及每只喵答道多少次. [思路] 后缀数组 将所有的串连起来,包括姓名和询问.处理出rank[],sa[],height[],通过rank确定一个询问的位置,然后在height上左右各扫一下,统计即可.flag对同一只标记,kase是时间戳(也算知道叫什么了=-=) [代…
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1906  Solved: 839[Submit][Status][Discuss] Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点名,每次读出一个串的时候,如果这个串是一个喵星人的姓或名的子串,那…
题意 给你一个长度为 \(n\) 的字符串,问 \(LCP(i,j)+(w_i\ xor\ w_j)\) 的最大值,其中 \(LCP\) 表示两个后缀的最长公共前缀. \(n\le 10^5\) 分析 建立 \(SA\) 之后把所有的 \(height\) 从大到小加入,维护连通块(类似 \(MST\) ),这样可以找到某个 \(height\) 作为两个后缀的 \(LCP\) 长度时的合法的区间,启发式合并 \(trie\) 即可. 或者也可以建 \(SAM\) ,\(parent\) 树上启…
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2068  Solved: 907[Submit][Status][Discuss] Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点名,每次读出一个串的时候,如果这个串是一个喵星人的姓或名的子串,那…
a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点名,每次读出一个串的时候,如果这个串是一个喵星人的姓或名的子串,那么这个喵星人就必须答到. 然而,由于喵星人的字码过于古怪,以至于不能用ASCII码来表示.为了方便描述,a180285决定用数串来表示喵星人的名字. 现在你能帮助a180285统计每次点名的时候有多少喵星人答到,以及M次点名结束后每个喵星人答到多少次吗?…
Trie 计数+Trie,读清题意很重要 https://vjudge.net/problem/UVALive-5913 kmp AC自动机 模板:https://vjudge.net/problem/UVA-11488 https://vjudge.net/problem/UVA-11019 https://vjudge.net/problem/UVA-11468 https://vjudge.net/problem/UVALive-4670 强大的AC自动机+DAG https://vjud…
点此看题面 大致题意: 每个人的名字由姓和名构成,如果某次点名点到的字符串是某人姓或名的一个子串,则这个人就被点到了.求每次点名被点到的人的个数及每个人被点到的总次数. 后缀数组+莫队 这道题做法很多,可以用各种神仙自动机乱搞,也可以用后缀数组+莫队一起做. 像我这么弱,什么自动机都不会,自然选择后面一种方法啦. 后缀排序预处理 首先我们要用一个后缀数组题常用的技巧,即将所有人的姓和名全部拼在一起,同时用\(p\)数组存储每个字符是属于哪一个人的. 然后便是一遍后缀排序,求出\(SA\)数组.…
参考资料:victorique的博客(有一点锅无伤大雅,记得看评论区),$wzz$ 课件(快去$ftp$%%%),$oi-wiki$以及某个人的帮助(万分感谢!) 首先还是要说一句:我不知道为什么我这么菜让我讲这么大神的知识点,我理解不深刻,你们可以随时$Ha(n)ck$然后我可能就fix不了了你知道吧 (好吧我大概又理解了因为数学是NC讲的数据结构是skyh讲的我能讲的可能也就是这种东西了) 希望还会的大神帮我解场...(某$bx$和某牛都$A$穿了) 顺便「无图预警」(懒得画又懒得粘) 当时…
我学AC自动机的时候就看到了这题,想用AC自动机结果被学长码风劝退-- 学后缀数组时又看到了这题--那就写写后缀数组做法吧 结果码风貌似比当年劝退我的学长还毒瘤啊 对所有的模式串+询问串,不同串之间用不同分隔符隔开,然后建后缀数组 第一问,显然所有包含询问串的后缀们的排名是一段连续的区间.于是就可以用ST表处理每两个后缀间的最长公共前缀,然后二分左端点和右端点.于是就变成了一个模板得不能再模板的,数一个区间中出现了多少个不同的数的莫队 第二问,考虑差分:每次询问时,如果一个串第一次出现,加上这个…
题目大意 给你一颗trie树,令\(s_i\)为点\(i\)到根的路径上的字符组成的字符串.求\(max_{u\neq v}(LCP(s_u,s_v)+LCS(s_u,s_v))\) \(LCP=\)最长公共前缀,\(LCS=\)最长公共后缀 \(1\leq n\leq 200000\),字符集为\(\{0\ldots 300\}\) 题解 我们先看看这个\(LCP(s_u,s_v)\)怎么求 广义后缀自动机不行.广义后缀树可能可以,但我不会.广义后缀数组可以.然后我就开始手推广义后缀数组 广义…
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; int sa[N],rk[N],hei[N],x[N],y[N],c[N]; char s[N]; void Rsort(R n,R m){ for(R i=1;i<=n;++i)++c[x[i]]; for(R i=2;i<=m;++i)c[i]+=c[i-1]; for(R i=n;i;--…
[BZOJ5304][HAOI2018]字串覆盖(后缀数组,主席树,倍增) 题面 BZOJ 洛谷 题解 贪心的想法是从左往右,能选就选.这个显然是正确的. 题目的数据范围很好的说明了要对于询问分开进行处理. 先考虑询问的模板串长比较大的情况. 那么只需要每次找到一个范围内的最小位置然后接着暴力跳就可以了. 这个这个过程可以把\(AB\)两个串拼接在一起求\(SA\),这样能够匹配上\(P\)串的\(A\)的后缀的起始位置在\(SA\)上就是一段连续区间.考虑每次找出在\(A\)的\([l,r]\…
后缀自动机构造后缀数组. 因为有个SB题洛谷5115,它逼迫我学习后缀数组...(边分树合并是啥?). 一些定义:sa[i]表示字典序排第i的后缀是从哪里开始的.Rank[i]表示后缀i的排名.height[i]表示排名i和i - 1的后缀的最长公共前缀. 首先我们可以建出后缀树,然后按字典序DFS即可获得sa数组和rank数组. 接下来要求height,使用经典后缀数组的求法即可. 说一下关于后缀数组经典倍增构造方法的一些理解.关于网上流传的那个锯齿形图,其实就是把上一次的两个排名拼接起来进行…
1031: [JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0把它们按照字符串的大小排序:07JSOI 7JSOI0 I07JSO JSOI07 OI07JS SOI07J读出最后一列字符:I0O7SJ,就是加密后的字符串(…
Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. 今年,竞赛委员会在接受队伍报名时,采用了一种新的登记规则:他们把所有队伍中奶牛名字的首字母取出,按它们对应奶牛在队伍中的次序排成一列(比如说,如果FJ带去的奶牛依次为Bessie.Sylvia.Dora,登记人员就把这支队伍登记为BSD).登记结束后,组委会将所有队伍的登记名称按字典序升序排列,…
Description Given two strings, you have to tell the length of the Longest Common Substring of them. For example:str1 = bananastr2 = cianaic So the Longest Common Substring is "ana", and the length is 3. Input The input contains several test case…