![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后缀数组
EMber _
人但有追求,世界亦会让路。
展开
-
BZOJ1031[JSOI2007]字符加密Cipher 后缀数组
一万年没打过SA。。 对于原串复制一遍,然后对于每个i<=n的,输出一下他的末尾就好了。#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) us原创 2017-04-25 21:36:32 · 223 阅读 · 0 评论 -
bzoj1692 [Usaco2007 Dec]队列变换 后缀数组+贪心
比较简单的后缀数组应用题。。 首先肯定是贪心选,不同的自不用说,相同的看他后面的字串是否更优秀,这就用到了rank的作用,看两个字串的rank哪一个更小哪一个更优。 求rank的时候直接把字符串加个区分符然后倒过来黏贴一遍,然后直接做就好了。 一般来说后缀数组的题目,一开始要想怎么操作,然后用SA去优化,而不是老是想着用SA怎么做,这样子很容易失了智,啥都想不到 = =#include<cst原创 2017-06-07 02:12:07 · 351 阅读 · 0 评论 -
bzoj2251[2010Beijing Wc]外星联络 后缀数组
题意:一串01串,让你找出所有在串中出现过次数大于1的字串的出现次数,按照字典序输出。 明显后缀数组。。。 重复的话,我们求出height以后,求出当前height[i]对应的起点sa[i],然后长度为height[i],左右暴力扩展,注意这里扩展的是排名而不是下标,所以这时字串的出现次数就是扩展的距离之和了。#include<cstdio> #include<algorithm> #inclu原创 2017-06-07 10:25:26 · 343 阅读 · 0 评论 -
bzoj4698Sdoi2008 Sandy的卡片 后缀数组+二分
其实不是很难的一道题,但是被坑了很久= =。。。 首先他没有给出字符集所以我们要自己算出来。 然后,离散一下,这里的离散是把所有的数字变成他们之间的差(这个很显然但是不好想,可能是我有点sb想了半天才想到) 然后SA求出height以后二分判断的时候扫一遍看看连续LCP>=mid的是否有n个就可以了。#include<cstdio> #include<algorithm> #include<c原创 2017-06-07 14:24:47 · 266 阅读 · 0 评论 -
bzoj2119 股市的预测 后缀数组+rmq
题目其实就是给你一段字符串问你类似ABA这种形式的有多少个,其中B的长度给出。 首先要差分,这个就比较明显了。 然后我们初始化ST表,正反各做一遍SA,求出正反的height和rank。 然后由于suf[a],suf[b]的lcp为min(height[a+1]~height[b])所以用ST表处理可以达到O(1)查询。 然后我们对于原串,枚举走势相同的长度为L,每L个设置一个关键点,可以发原创 2017-06-08 01:22:06 · 310 阅读 · 0 评论 -
bzoj1717 [Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组 论文题
这题是罗大神的论文题= =求重复k次的最长子串。 求出height以后二分判断或者单调队列都是可以的,我选择二分w。 实力诠释一波眼瞎,判断一个n打成n-1调了半天。。#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #原创 2017-06-04 16:07:59 · 288 阅读 · 0 评论 -
poj1743 Musical Theme 后缀数组
题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题。“主题”是整个音符序列的一个子串,它需要满足如下条件: 1.长度至少为5个音符。 2.在乐曲中重复出现。(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数值) 3.重复出现的同一主题不能有公共部分。 二分答原创 2016-12-13 22:25:48 · 301 阅读 · 0 评论