題面:
字尾陣列 (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 個,這個後面解釋,於是把沒有分支並且不是字尾節點的點壓縮到一起,就變成了字尾樹。不難發現,字尾樹可以表示該字串的所有子串。下面分析一下...