随笔分类 -  字符串——后缀数组

posted @ 2020-06-04 07:48 wxyww 阅读(46) 评论(0) 推荐(0) 编辑
摘要:比赛链接 A.SA problem 给出一个字符串S,然后有Q次询问,每次询问给出一个字符串T,对于每个询问需要回答:S中有多少个连续子串与T恰好有一个字符不相同。 \(|S|,\sum|T| \le 5\times 10^5\) solution 先对于S建出后缀数组,然后对于一个询问T。枚举T的 阅读全文
posted @ 2020-04-20 21:28 wxyww 阅读(116) 评论(0) 推荐(0) 编辑
摘要:"题目链接" solution 直接暴力后缀数组。 将两个字符串接到一起,然后跑一遍后缀数组。 因为可以有3个字符不同,那我们就枚举第一个字符串中和第二个字符串第一个字符相匹配的位置。从这个位置开始每次跳$LCP$长度。看跳4次之后能不能跳到最后就行了。 求$LCP$长度的时候用$ST$表 code 阅读全文
posted @ 2020-04-20 19:46 wxyww 阅读(144) 评论(0) 推荐(0) 编辑
摘要:"题目链接" solution 用后缀数组来处理。将两个字符串拼接到一起,然后跑一边后缀数组。 后面的如果暴力做的话,就是枚举一下相同字符串的起始位置,然后用$height$数组求一下这两个后缀的$LCP$,答案加上$LCP$就行了。 然后考虑优化,枚举贡献,也就是枚举一个$height_i$找到以 阅读全文
posted @ 2020-04-20 08:50 wxyww 阅读(105) 评论(0) 推荐(1) 编辑
摘要:"题目链接" solution 用后缀数组水一发后缀自动机的模板233 先跑一遍后缀数组,求出来height。然后根据height的性质,枚举造成贡献的位置,然后看一下这个位置在最长多长的一段区间内均为最小值。答案就是$len_i height_i$。$len_i$表示最长长度为$len_i$的一段 阅读全文
posted @ 2019-01-30 21:15 wxyww 阅读(122) 评论(0) 推荐(0) 编辑
摘要:题目链接 思路 观察题目中的式子,可以发现前两项是定值。所以只需要求出最后一项就行了。 然后题目就转化为了求字符串中所有后缀的$lcp$长度之和。 可以想到用后缀数组。在后缀数组上两个后缀的$lcp$长度表现为两个后缀排名之间的$height$的最小值。 所以现在问题就又转化为了在$height$数 阅读全文
posted @ 2018-12-20 08:14 wxyww 阅读(163) 评论(0) 推荐(0) 编辑
摘要:定义——来自百度百科 子串 一个字符串中连续的一段成为这个字符串的子串。 后缀 后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字符串 r 的从 第 i 个字符开始的后缀表示为 Suffix(i) ,也就是Suffix(i)=r[i,len(r)] 。 子串的大小 大小比较:关于字符串的 阅读全文
posted @ 2018-12-19 22:23 wxyww 阅读(251) 评论(0) 推荐(0) 编辑
摘要:题目链接 思路 先求出后缀数组,并且求出LCP。二分一下长度len。check的时候就是看有没有连续的k个后缀的LCP大于len。也就是判断是不是有连续的k 1个height大于len。 代码 cpp include include using namespace std; typedef long 阅读全文
posted @ 2018-12-19 22:18 wxyww 阅读(246) 评论(0) 推荐(0) 编辑
摘要:题目链接 思路 首先肯定想到贪心,从队尾和队首取更小的那个。 但是如果遇到队尾和队首一样大的情况呢,总不能再挨个往前比较。所以就把整个字符串倒过来再挂到现在字符串的后面,也就是把当前字符串对称过去。然后求出后缀数组,给每个后缀都求个排名。然后每次取得时候取排名更小的就行了。 注意这个题的输出格式,每 阅读全文

点击右上角即可分享
微信分享提示