題目大意:給乙個字串,假設長度為n,那麼它就有n個字尾,求排名為i的字典序,並求出排序中相鄰串的最長公共字首。
題解:hash+二分(假設字串從1開始)
如果將n個字尾字串用sort排序,需要比較nlogn次,每次比較最差需要o(n),所以時間複雜度為o(n^2logn)
考慮將o(n)的比較用二分優化為log(n)。
當比較兩個字串時,我們只需要比較它的第乙個不相同的位置,所以我們二分最長公共字首,設為maxlen。
若str1[maxlen+1]>str2[maxlen+1].則str1的字典序更大。
用字首雜湊值判斷字首是否相等。
#include#include#include
#include
using
namespace
std;
typedef unsigned
long
long
ull;
const
int n=300000+3
;const ull base=131
;int
len;
char
s[n];
intsa[n];
ull f[n],p[n];
ull get_hash(
int l,int
r)bool check(int x,int a,int
b)int get_max_pre(int x,int
y)
return
ans;
}bool cmp(int x,int
y)int
main()
sort(sa+1,sa+len+1
,cmp);
for(int i=1;i<=len;i++) printf("
%d ",sa[i]-1
); printf("\n
");for(int i=1;i<=len;i++) printf("
%d ",get_max_pre(sa[i],sa[i-1
]));
return0;
}
acwing 140 字尾陣列
題面 字尾陣列 sa 是一種重要的資料結構,通常使用倍增或者dc3演算法實現,這超出了我們的討論範圍。在本題中,我們希望使用快排 hash與二分實現乙個簡單的o n log2 n o nlog2n o nlog2n 的字尾陣列求法。詳細地說,給定乙個長度為 n 的字串s 下標 0 n 1 我們可以用...
1402 字尾陣列 (hash 二分)
描述 字尾陣列 sa 是一種重要的資料結構,通常使用倍增或者dc3演算法實現,這超出了我們的討論範圍。在本題中,我們希望使用快排 hash與二分實現乙個簡單的 o n log 2 n 的字尾陣列求法。詳細地說,給定乙個長度為 n 的字串s 下標 0 n 1 我們可以用整數 k 0 k 輸入格式 乙個...
poj2774(字尾陣列 字串hash)
求兩個串的最長公共子串 將兩個串連起來,求字尾陣列,sa中相鄰兩個字尾如果不屬於同乙個模版,則用這個height更新答案,他們的最長公共字首更新答案 include include include include include include define max x,y x y x y usin...