AcWing 140 字尾陣列 hash 二分

2022-09-14 12:15:07 字數 1090 閱讀 3042

題目大意:給乙個字串,假設長度為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...