随笔分类 -  数据结构—后缀数组

摘要:SA的话t==0直接预处理出每个后缀的不同串贡献二分即可,然后t==1就按字典序枚举后缀,然后跳右端点计算和当前后缀的前缀相同的子串个数,直到第k个 不过bzoj上会T cpp include include include using namespace std; const int N=1000 阅读全文
posted @ 2019-04-16 18:30 lokiii 阅读(189) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2019-03-07 18:51 lokiii 阅读(9) 评论(0) 推荐(0)
摘要:把三个串加上ASCII大于z的分隔符连起来,然后求SA 显然每个相同子串都是一个后缀的前缀,所以枚举s1的每个后缀的最长和s2相同的前缀串(直接在排序后的数组里挨个找,最近的两个分别属于s1和s2的后缀的height一定是最长符合要求的前缀),然后判断一下这个子串里最早出现的和s3相同的子串的位置, 阅读全文
posted @ 2019-03-03 20:27 lokiii 阅读(125) 评论(0) 推荐(0)
摘要:先求SA,然后按字典序从小到大枚举子串,每到一个后缀从长到短枚举子串(跳过长为he[i]的和前一段重复的子串),然后维护一个点p,保证i~p之间最小的he =当前枚举长度,p是单调向右移的 然后把每个后缀的结果倒着输出即可 阅读全文
posted @ 2019-02-26 17:07 lokiii 阅读(105) 评论(0) 推荐(0)
摘要:总是犯低级错误,st表都能写错…… 正反分别做一遍SA,预处理st表方便查询lcp,然后处理a[i]表示前i个后缀一共有多少个本质不同的子串,这里的子串是按字典序的,所以询问的时候直接在a上二分排名就能得到询问区间,然后用正反st表查lcp即可 cpp include include include 阅读全文
posted @ 2019-02-26 11:36 lokiii 阅读(163) 评论(0) 推荐(0)
摘要:用SA求出height数组,然后发现每个height值都有一个贡献区间(因为点对之间要依次取min) 用单调栈处理出区间,第一问就做完了 然后用并查集维护每个点的贡献(?),从大到小枚举height,因为这样区间是不断增大的所以并查集合并即可 cpp include include include 阅读全文
posted @ 2019-02-01 23:13 lokiii 阅读(118) 评论(0) 推荐(0)
摘要:SAM里的转台不会有重复串,所以答案就是每个right集合所代表的串个数的和 cpp include include include using namespace std; const int N=100005; int T,n,fa[N],ch[N][27],dis[N],cur=1,con=1 阅读全文
posted @ 2018-11-23 15:59 lokiii 阅读(167) 评论(0) 推荐(0)
摘要:先加入未出现字符间隔把n个串连起来,注意如果串开的char这个间隔字符不能溢出,把这个接起来的串跑SA,二分答案k,判断的时候把连续一段he =k的分成一组,然后看着一段是否包含了 n/2的串的后缀。 统计是否出现这里可以用时间戳优化visit数组,就不用每次memset了 输出答案的时候和二分判断 阅读全文
posted @ 2018-11-21 10:45 lokiii 阅读(107) 评论(0) 推荐(0)
摘要:把两个串中间加一个未出现字符接起来,然后求SA 然后把贡献统计分为两部分,在排序后的后缀里,属于串2的后缀和排在他前面属于串1的后缀的贡献和属于串1的后缀和排在他前面属于串2的后缀的贡献 两部分分别作,都用单调栈维护一段里的height最小值(因为lcp是排序后两后缀中间height最小值),然后根 阅读全文
posted @ 2018-11-21 09:01 lokiii 阅读(118) 评论(0) 推荐(0)
摘要:把两个串接到一起求一个SA,然后找最大的sa[i]和sa[i 1]不是一个串的he[i] cpp include include include using namespace std; const int N=500005; int n,m,wa[N],wb[N],wv[N],wsu[N],sa[ 阅读全文
posted @ 2018-11-20 19:20 lokiii 阅读(94) 评论(0) 推荐(0)
摘要:差分,然后二分长度mid,判断是把height按照min不小于mid分组,取最大最小的sa位置看是否 =mid即可,注意差分后最后答案要+1 阅读全文
posted @ 2018-11-20 14:32 lokiii 阅读(93) 评论(0) 推荐(0)
摘要:何万と積もった 懸念を 線状に 切り裂いていく 阅读全文
posted @ 2018-09-28 15:05 lokiii 阅读(177) 评论(0) 推荐(0)
摘要:You come over and start up a conversation with just me And trust me I'll give it a chance now 阅读全文
posted @ 2018-09-24 21:59 lokiii 阅读(172) 评论(0) 推荐(0)
摘要:海岛冰轮初转腾 见玉兔 玉兔又早东升 阅读全文
posted @ 2018-09-24 16:34 lokiii 阅读(207) 评论(0) 推荐(0)
摘要:守られていたはずの檻が 閉じ込められていたと気付いた 阅读全文
posted @ 2018-09-24 15:42 lokiii 阅读(124) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-09-11 20:34 lokiii 阅读(2) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-08-17 20:34 lokiii 阅读(3) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-05-08 19:09 lokiii 阅读(4) 评论(0) 推荐(0)
摘要:注意输出是80字符个一行!! 首先贪心很显然,就是两头尽量拿小的。 然后需要处理两头一样的情况,显然是选字典序小的一串,把数组反着接在原数组后面,然后跑sa,判断的时候直接比较rk数组 cpp include include include using namespace std; const in 阅读全文
posted @ 2018-04-25 11:40 lokiii 阅读(142) 评论(0) 推荐(0)