本文參考了 字尾陣列--處理字串的有力工具
子串:字串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 ...