
后缀数组
make_it_for_good
这个作者很懒,什么都没留下…
展开
-
codeforces 700E 后缀数组
题意:定义a串比b串优当且仅当a串中至少包含两个b串(可以重叠),给出一个串w,求一个最长的由w的子串构成的序列,满足第i个串比第i-1个串优。题解后缀自动机没看懂,看了评论中的一个后缀数组做法。定义一个串是好串当该串长度为1或该串的前缀和后缀都有同一个好串且该好串不出现在该串中间。 那么对于每一个后缀取一个最长的是后缀前缀的好串,最终答案一定由这些好串组成。从n到1枚举求是当前串前缀的最长好串,原创 2016-08-20 13:39:06 · 1322 阅读 · 0 评论 -
bzoj 3998 [TJOI2015]弦论 后缀数组||后缀自动机
一开始写了一发后缀数组。 T=0的时候直接把所有的n-sa[i]+1-h[i]加到一起一直到K就行了。 T=1时枚举每一位是什么,二分求一下范围,处理一个n-sa[i]+1的前缀和。 本来以为会T,结果并没有。。。#include <bits/stdc++.h>using namespace std;#define N 510000#define ll long longchar s[原创 2016-10-31 10:33:13 · 624 阅读 · 0 评论 -
bzoj 2251 后缀数组
建出后缀数组,按字典序深搜一遍整个后缀数组。 记录当前深度和左右端点,对于当前层找出左右端点的01分界点,然后分别搜两边。#include <bits/stdc++.h>using namespace std;#define N 3100int n;char s[N];int sa[N],rank[N],tr[N],has[N];int cmp(int x,int y,int k){原创 2016-10-19 15:55:18 · 442 阅读 · 0 评论 -
bzoj 3796 Mushroom追妹纸 后缀数组 kmp
一开始写了个后缀自动机,还调了半天,然后发现gg了。。。 果然后缀自动机不支持删除所有包含一个子串的节点(好像什么都不支持。。。。)先把s1,s2连到一起,中间用非法字符隔开。 先kmp求有哪些位置有s3,然后可以求每个点开始往后不包含s3的最长前缀。 求一个后缀数组。从前往后扫一遍后缀数组,维护一下s2到当前位置的最长不包含s3的前缀,如果遇到一个s1的后缀那么更新一下答案。 再从后往前原创 2016-10-28 18:13:45 · 305 阅读 · 0 评论 -
bzoj 2119 后缀数组
题意:给一个串,求形如ABA,其中B的长度为m,A的长度不限的子串的数量。求正串反串的后缀数组和对于h的RMQ。枚举A串长度len,对于每个长度为len的区间处理在这段区间开始的子串个数。每隔len枚举i,然后用RMQ求i和i+len+m的最长公共前缀后缀l,r。统计长度为len的在区间 [ i-l+1 , i+r-1 ] 内部的长度为len的串个数。为了避免算重,l和r对len取min。#incl原创 2016-10-19 10:39:42 · 246 阅读 · 0 评论 -
bzoj 3238 [Ahoi2013]差异 后缀数组 并查集
求一遍后缀数组。初始答案=(n-1)*n*(n+1)/2 按h从大到小枚举每个间隔,然后用并查集合并时把两个size乘积*2从答案中减掉。#include <bits/stdc++.h>using namespace std;#define A 27#define N 510000#define ll long longint n;char s[N];int sa[N],h[N],原创 2016-10-26 14:10:19 · 270 阅读 · 0 评论 -
bzoj 3230 相似子串 后缀数组
直接对正串反串建后缀数组,然后求一个h和h的rmq。对于正串处理一个(n-sa[i]+1)-h[i]的前缀和。 然后对于给的第i个子串,直接在前缀和上二分。然后rmq。 注意long long#include <bits/stdc++.h>using namespace std;#define A 27#define N 110000#define ll long long#defin原创 2016-10-26 13:30:17 · 280 阅读 · 0 评论 -
bzoj 4556 [Tjoi2016&Heoi2016]字符串 二分+后缀数组+主席树+RMQ
求一个后缀数组和height的rmq。 对rank建一个主席树。二分第二个串的匹配长度len。再二分出后缀数组中与第二个串lcp大于等于len的左右边界lq,rq。设四个点为l1,r1,l2,r2。那么第一个串只有开头为[l1,r1-len+1]的后缀可以匹配。那么如果rank[l1,r1-len+1]有在区间[lq,rq]中的,那么可行。 这个可以到主席树中查询。时间复杂度O(nlog^2)。原创 2016-11-03 11:13:46 · 321 阅读 · 0 评论 -
bzoj 2754 [SCOI2012]喵星球上的点名 后缀数组+莫队
先把所有串按顺序放到一起,两个串间加非法字符隔开,求一个后缀数组。然后对于询问,满足条件的子串在后缀数组上一定是连续一段区间。 这个区间的左右端点可以在读入的过程中二分求。然后这个问题变成了多组询问求一段区间内不同的数的个数。 莫队裸题。 慢着,每个元素的出现次数怎么求呀? 莫队时维护,设共有cnt个询问,那么第i个询问时一个元素的出现状态的改变会影响到cnt-i+1个询问中该元素的出现状态原创 2016-10-21 18:37:48 · 433 阅读 · 0 评论 -
bzoj 3879 SvT 后缀数组 rmq 并查集
先求出后缀数组。 对于每组询问,按rank排序,求相邻两个的lcp,按lcp从大到小合并相邻两个,用并查集维护。#include <bits/stdc++.h>using namespace std;#define N 510000#define M 3100000#define ll long long#define mod 23333333333333333llint n,m,Q;原创 2016-12-20 15:41:01 · 489 阅读 · 0 评论