字尾陣列的應用

2021-06-22 08:55:23 字數 1628 閱讀 1411

本文參考了 字尾陣列--處理字串的有力工具

子串:字串s 的子串r[i..j],i≤j,表示r 串中從i 到j 這一段,

也就是順次排列r[i],r[i+1],...,r[j]形成的字串。

字尾:字尾是指從某個位置i 開始到整個串末尾結束的乙個特殊子串。字串r 的從第i 個字元開始的字尾表示為suffix(i) , 也就是

suffix(i)=r[i..len(r)]

字尾陣列:字尾陣列sa 是乙個一維陣列,它儲存1..n 的某個排列sa[1],

sa[2],……,sa[n],並且保證suffix(sa[i]) < suffix(sa[i+1]),1≤i用倍增演算法:

倍增演算法的主要思路是:用倍增的方法對每個字元開始的長度為2k 的子字

符串進行排序,求出排名,即rank 值。k 從0 開始,每次加1,當2k 大於n 以

後,每個字元開始的長度為2k 的子字串便相當於所有的字尾。並且這些子字

符串都一定已經比較出大小,即rank 值中沒有相同的值,那麼此時的rank 值就

是最後的結果。每一次排序都利用上次長度為2k-1 的字串的rank 值,那麼長

度為2k 的字串就可以用兩個長度為2k-1 的字串的排名作為關鍵字表示,然

後進行基數排序,便得出了長度為2k 的字串的rank 值。

**如下:

/*倍增演算法   */

#define maxn 255

int wa[maxn],wb[maxn],wv[maxn],wsn[maxn];

/*最後乙個為0 這樣不會溢位的 哈哈*/

int cmp(int *r,int a,int b,int l)

//r表示 rank陣列

void da(int *r,int *sa,int n,int m)

;/*求height陣列 h(i)=height[rank[i]] h[i]>=h[i-1]*/

struct information fun_height(string str)//呼叫sort生成字尾陣列 }

delete src;

delete rank;

res.height=height;

res.sa=sa;

return res;

}

以上出字尾陣列和height陣列 

下面看幾個字尾陣列的例子:

回文問題:

考慮到回文長度為奇數 偶數的情況,**如下:

void get_longest_huiwen2(string str)

else

break;

length+=2;

if(max=0)

else

break;

length+=2;

if(max

**如下:

/*最長回文子串*/

bool isok(int *sa,int i,int len)

void get_longest_huiwen(string str2)

else if(flag&&info.height[i]max)

max=info.sa[ii];

if(info.sa[ii]=k)

{cout<<"最大不重複的 "<

字尾陣列的應用

1.求乙個字串所有不同的子串個數 子串意味著是連續的 比如 abaaba 它的字串包括 a,b,aa,ab,ba,aba,baa,aab,abaa,baab,aaba,abaab,baaba,abaaba。這個就可以用字尾陣列的結果求解。首先,我們知道sa陣列,裡面是排好序的所有字尾,運用字尾的想法...

字尾陣列的應用一

1 可重疊的最長連續子串 題意 給乙個字串,問重複出現的連續的子串中最長的,重複的子串可以有重疊的部分,若結果不止乙個則輸出字典序最小的 例 對於字串 abcabcabc 結果為 abcabc 對於字串 abcdggabc 結果為 abc 解法 找到height陣列中最大的,假設height i 是...

字尾陣列學習與應用

sa i 即,排名為i的字尾的起點下標 rank i 即,第i個字尾的排名 height i 即,sa i 和sa i 1 的最長公共字首 h i 即,height rank i 即第i個字尾與前一名的最長公共字首 結論一 定義 lcp i,j lc p su ffix sa i s uffi x ...