acwing 140 字尾陣列

2022-05-01 17:57:11 字數 1313 閱讀 8007

題面:

字尾陣列 (sa) 是一種重要的資料結構,通常使用倍增或者dc3演算法實現,這超出了我們的討論範圍。

在本題中,我們希望使用快排、hash與二分實現乙個簡單的o(n

log2

n)'>o(nlog2n)

o(nlog2n)的字尾陣列求法。

詳細地說,給定乙個長度為 n 的字串s(下標 0~n-1),我們可以用整數 k(0≤k

<

n'>0≤k0≤k把字串s的所有字尾按照字典序排列,排名為 i 的字尾記為 sa[i]。

額外地,我們考慮排名為 i 的字尾與排名為 i-1 的字尾,把二者的最長公共字首的長度記為 height[i]。

我們的任務就是求出sa與height這兩個陣列。

輸入格式

輸入乙個字串,其長度不超過30萬。

輸出格式

第一行為陣列sa,相鄰兩個整數用1個空格隔開。

第二行為陣列height,相鄰兩個整數用1個空格隔開,我們規定height[1]=0。

輸入樣例:

ponoiiipoi

輸出樣例:
9 4 5 6 2 8 3 1 7 0

0 1 2 1 0 0 2 1 0 2

題解:二分得出兩個開頭字尾的最長字首,然後根據不同的寫個排序函式排序,

#include#include

#include

#define ull unsigned long long

using

namespace

std;

const ull base=131

;const ull int_min=-1e6;

ull h[

300010],p[300010

];int sa[300010];int

n;char str[300010

];ull

get(int l,int

r)int get_max(int a,int

b)

returnl;}

bool cmp(int a,int b)//

排序函式

intmain()

sort(sa+1,sa+n+1

,cmp);

for(int i=1;i<=n;i++)printf("

%d ",sa[i]-1

); puts(

"");

for(int i=1;i<=n;i++)

puts(

"");

return0;

}

AcWing 140 字尾陣列 hash 二分

題目大意 給乙個字串,假設長度為n,那麼它就有n個字尾,求排名為i的字典序,並求出排序中相鄰串的最長公共字首。題解 hash 二分 假設字串從1開始 如果將n個字尾字串用sort排序,需要比較nlogn次,每次比較最差需要o n 所以時間複雜度為o n 2logn 考慮將o n 的比較用二分優化為l...

字尾樹 字尾陣列

在字串處理當中,字尾樹和字尾陣列都是非常有力的工具,其中字尾樹大家了解得比較多,關於字尾陣列則很少見於國內的資料。其實字尾陣列是字尾樹的乙個非 常精巧的替代品,它比字尾樹容易程式設計實現,能夠實現字尾樹的很多功能而時間複雜度也不太遜色,並且,它比字尾樹所占用的空間小很多。可以說,在資訊學競賽 中字尾...

字尾樹 字尾陣列

我們考慮將乙個串的所有字尾插入乙個trie中,得到的trie就是字尾trie。我們可以發現,樹上有分叉或者是字尾節點的點的個數是o l en o len o len 個,這個後面解釋,於是把沒有分支並且不是字尾節點的點壓縮到一起,就變成了字尾樹。不難發現,字尾樹可以表示該字串的所有子串。下面分析一下...