2021.2.3做题小结
1.3714 后缀数组
题意:求出 SA 数组和 Height 数组
思路:模板题
2.单调栈
题意:求每个数后第一个大于他的数
思路:模板题
3.[AHOI2013]差异
题意:给定一个长度为 n 的字符串 SS,令 T_i 表示它从第 i 个字符开始的后缀。求
其中,len(a) 表示字符串 a 的长度,lcp(a,b) 表示字符串 a 和字符串 b 的最长公共前缀。
思路:
对 ans 进行化简:
需要明确的是 lcp(x,y)=min(height[x...y])
所以先建立字符串的后缀数组。考虑 Height 数组的贡献:Height 数组中 [2, n] 内的每一个区间都给答案贡献区间最小值。
单调栈解决
4.[luogu1886]滑动窗口
题意:长度固定的区间最大/小值
思路:单调队列模板题
5.[POJ3974]Palindrome
题意:求最大回文子串长度
思路:manacher模板题
6.[国家集训队]拉拉队排练
题意:http://fzuoj.xndxfz.com/problem/3465
思路:一个和谐小群体是一个长度为奇数的回文串,所以我们可以用manacher来解决此题
然后因为这个题只需要求出奇数长度的回文串,所以不需要考虑插入字符
注意:1.需要快速幂 2.eg:ababa 回文半径为5 但它也包含了 a bab ababa 即如果一个值为x(x>1)那x-1,x-2.....也存在。所以需要用前缀和统计,用桶存储一下回文半径,倒着搜一遍即可
7. [国家集训队]最长双回文串
题意:求字符串的最长子串SS满足可以分为X,Y,使得X,Y 都是回文串。
思路:manacher 维护最长回文半径 p[i] 的同时,再分别维护以i为结尾的最长回文子串的长度 ll[i],和以 i 为开头的最长回文子串的长度 rr[i]。 ll[i+p[i]−1]=max(ll[i+p[i]−1],p[i]−1) rr[i-p[i]+1]=max(rr[i-p[i]+1],p[i]-1)
注意:manacher 求出的每个l[i]和r[i]都是在i最大的情况下求的,而看到 第6题的注意点2,发现中 间一连串的点没有考虑。枚举每一个‘#’,O(n)递推出每个'#'为断点的 ll[i] 和 rr[i],其中 rr[i] 因为是 i 结尾的回文长度,所以直接顺推,每往后移一位,最长回文子串长度-2。
即rr[i]=max(rr[i],rr[i−2]−2) ll[i]=max(ll[i],ll[i+2]-2),(ll逆推)。
8.[POI2010]Antisymmetry
题意:对于一个0/1序列,求出其中异或意义下回文的子串数量
思路:改变 manacher 匹配条件即可
注意:子串长度为奇数时,不可能满足异或后与原来相同的要求
9.lyndon分解
题意:RT
思路:模板题