后缀数组
穷源溯流
路很长,尽管走便是。
展开
-
POJ 2774 Long Long Message(后缀数组)
求两个字符串的最长公共序列 将两个字符连接起来,求 height 数组,如果排名为i 的后缀与排名为 i-1 的后缀不属于同一个字符串即为答案,求答案的最大值 const int N=2e5+5; int n,m; int i,j,k; char s[N],a[N]; int tp[N],tax[N],rk[N],sa[N]; int ht[N]; bool cmp(int rk[],int x,int y,int w) { re...原创 2021-03-17 21:15:23 · 155 阅读 · 0 评论 -
洛谷 P2852 [USACO06DEC]Milk Patterns G(后缀数组+单调队列)
题目要求出现过至少 k 次的公共子串,而且长度最长,如果求出现x 次公共子串的最大长度 (x>k),那么出现 k 次的公共子串的最大长度一定 >=出现 x 次的公共子串的最大长度 题目转化为在任意长度为 k 的区间中 hight[] 的最小值的最大值,可以利用单调队列求解 const int N=2e4+5; int n,m; int i,j,k; int a[N]; int sa[N],rk[N],tax[(int)1e6+5],tp[N]; ...原创 2021-03-17 09:36:02 · 161 阅读 · 0 评论 -
洛谷 P2870 [USACO07DEC]Best Cow Line G(后缀数组)
如样例所示:ACDBCB,一开始的时候可以轻易地将字符串变为 CDBC,之后需要考虑选择左边的 C,还是右边的 C,如果现在知道 CDBC 和 CBDC 两个字符串的字典序,那么可以轻易地选择。 所以需要预处理出 ACDBCB 的后缀数组和 BCBDCA 的后缀数组,这样当左右两边的字符相同时,就可以判断到底选择那边是最优的了,但是处理两个字符串的复杂度比较高,所以将字符串 S 反转过来接到 S 的后面就可以了 const int N=1e6+5; int n,m; int...原创 2021-03-15 11:28:25 · 250 阅读 · 0 评论 -
洛谷 P4051 [JSOI2007]字符加密(后缀数组)
不难想到先要将字符串 s 复制成 ss,这样求出它们的后缀数组就可以解决问题了 const int N=2e5+5; int n,m; int i,j,k; char s[N]; int rk[N],sa[N],tp[N],tax[N]; bool cmp(int rk[],int x,int y,int w) { return rk[x]==rk[y] && rk[x+w]==rk[y+w]; } void sort() { ...原创 2021-03-14 10:04:51 · 177 阅读 · 0 评论 -
P3809 【模板】后缀排序(后缀数组)
const int N=1e6+5; int n,m; int i,j,k; char s[N]; int rk[N],sa[N],tp[N],tax[N]; void sort() { for(int i=0;i<=m;i++) tax[i]=0; for(int i=1;i<=n;i++) tax[rk[i]]++; for(int i=2;i<=m;i++) tax[i]+=tax[i-1]; for(int...原创 2021-03-13 20:45:46 · 138 阅读 · 0 评论