字尾陣列總結

2021-06-29 01:25:43 字數 1677 閱讀 7114

附模板(字尾陣列)

void build_sa(int m,int n){

int *x=wa,*y=wb,*t;

for(int i=0;i=0;i--)sa[--c[x[i]]]=i;

for(int k=1;k<=n;k<<=1){

int p=0;

for(int i=n-k;i=k)y[p++]=sa[i]-k;

for(int i=0;i=0;i--)sa[--c[x[y[i]]]]=y[i];

t=x;x=y;y=t;

p=1;

x[sa[0]]=0;

for(int i=1;i

int dp[maxn][18];

void init_rmq(int n,int h)

{ for(int i=1;i

字尾陣列

sa[i] 表示排名為i的字尾sa[i];

rank[i] 表示字尾i排名rank[i];

height[i]表示相鄰排名的字尾的公共字首長度。

題目總結:

hdu 1403 longest common substring

求兩個串的最長公共子串長度。

解法:把兩個串接起來,拼成乙個串,擁有最長公共子串的兩個字尾必定排名是相鄰的。

判斷兩個字尾是否分別屬於兩個串即可。

poj 1703 musical theme

給定乙個序列,問重複趨勢相同的最長子串長度。

用後面減前面的,就可以得到趨勢字串。

同上面一題。

poj 3261 milk patterns

求可重疊最長k重複子串。

解法:二分答案,用mid值對height陣列進行分組,使得同一分組的相同字首均大於mid。分組內的字尾大於k,即為符合條件。

poj 3294 life forms

給定n個字串,求最長的子串,且這個子串出現在一半以上(超過一半)的字串中。

解法:連線字串,二分答案,height分組,判斷每組是否包含出現超過一半字串的字尾。

判斷的同時記錄下符合條件的字尾。

hdu 3518 boring counting

求最長不重疊至少出現了兩次的子串數量。

解法:列舉長度len,找符合條件的子串(字尾差大於長度即為不重疊)。

hdu 4622 reincarnation

求[l,r]區間內的不同子串數量。

解法: 和統計子串數量差不多,只不過再詢問時加了乙個遞推的優化。

hdu 4436 str2int

求多個串的不同子串不同權值和。

解法:依然是統計子串,加了乙個權值字首和的預處理。

hdu 2459 maximum repetition substring

求重複數最大且字典序最小的子串。

列舉重複串l的長度,計算相鄰l的最長公共字首k。因為有可能不是正好從l開始,

所以嘗試著向前找l-k%l。如果符合,次數加1,繼續向前暴力字典序。

字尾陣列總結

2子串個數問題 3迴圈子串問題 兩個字串串問題 2子串個數問題 多個字串問題總結 首先,使用倍增演算法求出對應sa,height值,時間複雜度o nlog n 具體定義參考國家集訓隊2009羅穗騫 中還給出一種線性dc3做法 include using namespace std const int...

字尾陣列題目總結

入門部落格 p3809 模板 字尾排序 p4051 jsoi2007 字元加密 將字串s複製為ss,做字尾陣列。p2870 usaco07dec best cow line g 題意 給出乙個字串,每次可以從字串的首位取出乙個字元,放到佇列的尾部,求可以得到的最小的字典序是多少?思路 pre i 表...

SA 字尾陣列 專題總結

曾經一度以為sa是大神知識點來著 後來才發現其實是澤州哥哥講得太深奧了我等蒟蒻不能參透 理解了之後題還是可以做的 因為大多數都不是在sa上做文章而是與其他知識點結合 迪哥講 sa 和 sam 鈦聚啦 放例題算是sa的板子題了吧 求出每個點能控制的區間,單調棧 二分都行,直接統計就行了 sa乙個套路就...