后缀数组刷题总结

T1:Sandy的卡片

做这道题时对$height[]$理解不深刻,导致一晚上没$A$掉这道题

显然是把差值当成字符数组,把串连起来处理出$height[]$

之后二分,开一个栈记录存储出现的元素,只要元素个数大于等于$n$即可判断合法

T2:喵星球上的点名

延续上一道题的套路,把名字和询问连成一个串

之后对于每个询问的起始位置二分出左右能做贡献的区间

现在问题转化为m个区间,求每个区间的不同颜色个数以及每个颜色的出现次数

可以用莫队解决

(然而二分完直接暴扫也可以$AC$)

T3:字符串

直接做的话前一个串有长度的限制,考虑二分答案来消除限制

之后便可以找到能贡献答案的区间查询区间内是否有$[a,b-len+1]$

便是主席树的板子

(这道题直接扫合法区间可以比主席树快$7000ms+$)

T4:差异

思路很简单,找出每个$height$成为最小值的区间计算答案即可

T5:相似子串

首先一个子串一定是后缀的前缀

所以$height[]$处理完之后相当于把子串也排好序了

直接二分便可以找出排名为i的子串

第一问直接查,第二问二分长度后再查,没必要把串反过来或者用hash

T6:品酒大会

四次理解错题意后还是痛苦$AC$了

最好想的思路便是维护最大(小)次大(小)值每次合并区间时硬查更新

但是发现并不需要维护次大(小)值,只需要把两个区间内的最大*最大,最小*最小更新答案即可

其他的情况一定在原来合并区间时被统计过

注意求解第一问时$height[1]$是没有直接贡献的应该把它跳过

T7:外星联络

虽然放在了后缀数组(二)里,但是的确是个板子题

对于每个后缀,只需要统计$[h[i-1]+1,h[i]]$在后面出现了多少次

加上2便是答案

原文地址:https://www.cnblogs.com/AthosD/p/12088542.html

时间: 2025-01-17 08:41:01

后缀数组刷题总结的相关文章

poj 1743 Musical Theme(男人八题&后缀数组第一题)

Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 17298   Accepted: 5939 Description A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the range 1..88, each representing a key on the

poj 2774 Long Long Message(后缀数组入门题)

1 /****************************************************************** 2 题目: Long Long Message(poj 2774) 3 链接: http://poj.org/problem?id=2774 4 题意: 给两个字符串,找最长的公共子串 5 算法: 后缀数组 6 算法思想: 后缀数组就是套模板求先应得数组,这题用到了两个数组,分 7 别是sa[],height[];sa[i]表示所有后缀按字典数排序后以s[i

后缀数组 模板题 hdu1403(最长公共(连续)子串)

好气啊,今天没有看懂后缀树和后缀自动机 只能写个后缀数组发泄一下了orz #include <cstdio> #include <cstring> const int N = 100017*2; int wa[N], wb[N], wv[N], ws[N]; int rank[N]; int height[N]; char str[N]; int s[N], sa[N]; int cmp(int *r, int a, int b, int l) { return r[a]==r[b

hdu1403 后缀数组入门题

//1403 思路:字符串的任何一个子串都是这个字符串的某个后缀的前缀,则求A和B的最长公共子串等价于求A的后缀和B的后缀的最长公共前缀的最大值. 做法:将第二个字符串写在第一个字符串后面,中间用一个没有出现过的字符隔开,再求这个新的字符串的后缀数组. 1 #include "bits/stdc++.h" 2 using namespace std; 3 const int maxn = 1e6 + 10; 4 char str[maxn]; 5 int int_str[maxn];

poj 2774 Long Long Message 后缀数组基础题

Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 24756   Accepted: 10130 Case Time Limit: 1000MS Description The little cat is majoring in physics in the capital of Byterland. A piece of sad news comes to him these days: his mother is ge

[UOJ#35] [UOJ后缀数组模板题] 后缀排序 [后缀数组模板]

后缀数组,解决字符串问题的有利工具,本题代码为倍增SA算法 具体解释详见2009年国家集训队论文 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cmath> 7 #include <ctime> 8 9 using namespace

kuangbin后缀数组 - I题 POJ3415 单调栈解法

题意,给出两个字符串,给一个k,求出满足a的字串与b的子串完全一样的长度>=k的所有情况的数量. 翻译一下题意就是求所有后缀中,lcp>=k的即可. 我们拼接两个字符串,中间用不出现的字符隔开即可. 然后就是如何求解的问题. 我们知道lcp(i,j)=min(height[i+1],....,height[j]) 所以我们进行da()后,getheight()获得数组后,就可以利用单调栈的性质来求解.可以类比最大子矩阵的求解方法. 假如我们排序出来的height数组为:2 ,3,3,4,3,1

POJ 3693 Maximum repetition substring(后缀数组神题)

POJ 3693 Maximum repetition substring 题目链接 题意:给定一个字符串,求出其子串中,重复次数最多的串,如果有相同的,输出字典序最小的 思路:枚举长度l,把字符串按l分段,这样对于长度为l的字符串,肯定会包含一个分段位置,这样一来就可以在每个分段位置,往后做一次lcp,求出最大匹配长度,然后如果匹配长度有剩余,看剩余多少,就往前多少位置再做一次lcp,如果匹配出来长度更长,匹配次数就加1,这样就可以枚举过程中保存下答案了 这样问题还有字典序的问题,这个完全可以

水比的 树状数组 刷题记录

洛谷P3374 [模板]树状数组 1 单点修改,区间查值.细节看代码 代码: 1 #include <bits/stdc++.h> 2 #define nmax 500010 3 4 using namespace std; 5 int n,m; 6 int a[nmax],qz[nmax]={0},c[nmax]; 7 8 inline int lowb(int x){ return x&(-x); } 9 10 void build(){ 11 cin>>n>&g