給定乙個文字串和乙個模式串,求文字串中有多少個連續的子串和模式串相差不超過三個字元。
算是一道字尾陣列的模板題。
直接做lcp,然後遇到匹配不上的就跳,跳的次數不能超過三次。
具體地,將兩個字串連在一起,中間加乙個分隔符,然後求出height,用rmq維護height陣列的區間最小值即可。
/************************************====
* author : ylsoi
* time : 2019.2.5
* problem : luogu3763
* e-mail : [email protected]
* ***********************************=*/
#include#define rep(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i)
#define drep(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i)
#define debug(x) cout<<#x<<"="const int maxn=2e5+10;
int t;
int n,m;
char s[maxn];
int sz,sa[maxn],tp[maxn],rk[maxn],tax[maxn],height[maxn];
int st[maxn][21],log[maxn];
void radix_sort()
void suffix_sort()
}void get_height()
}void init_st()
else ++p;
}} printf("%d\n",ans);
} return 0;
}
TJOI2017 DNA 字尾陣列
加里敦大學的生物研究所,發現了決定人喜不喜歡吃藕的基因序列s,有這個序列的鹼基序列就會表現出喜歡吃藕的性狀,但是研究人員發現對鹼基序列s,任意修改其中不超過3個鹼基,依然能夠表現出吃藕的性狀。現在研究人員想知道這個基因在dna鏈 s 上的位置。所以你需要統計在乙個表現出吃藕性狀的人的dna序列 s ...
構造 字尾陣列求逆
根據sa陣列反求原陣列,只能26小寫字母。有了sa,自然有了rank,從原陣列最後的往前考慮,我們盡量要將原陣列用小的字符集表示,因為只有26個字母可以表示,那麼排名比當前列舉的小一位的的字串,如果第二位比其小的話,那麼排名比當前列舉的小一位的的字串的首位可與其首位相同,同樣的向比它大的考慮一遍則可...
TJOI2015 弦論 字尾自動機求第k小串
對於乙個給定長度為 n 的字串,求它的第 k 小子串,若 t 為 0 表示不同位置的相同子串算作乙個,否則算作多個,子串數目不足 k 個,則輸出 1 n le 5 cdot 10 5 建sam,按拓撲序動態規劃求出每個結點後有多少個子串,然後貪心求解即可。include define rep i,x...