TJOI2017 DNA 字尾陣列求LCP

2022-05-07 22:36:23 字數 937 閱讀 8806

給定乙個文字串和乙個模式串,求文字串中有多少個連續的子串和模式串相差不超過三個字元。

算是一道字尾陣列的模板題。

直接做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...