字尾陣列 二分 hdu 5008

2021-09-02 06:40:55 字數 992 閱讀 2690

大致題意:

給出乙個長度小於100000的字串,求字串中字典序排在第k位的子串。

大致思路

聯動ural1590

這裡有乙個字尾陣列的基本規律,每個字尾去掉重複的字首之後留下的就是所有的子串。

eg字串 aabb 排列成字尾陣列之後,|代表height計算出的和sa[i-1]相同的部分

sa[1]=0    aabb    子串有 aa aab aabb

sa[2]=1    a|bb     子串有 a ab abb

sa[3]=3    b          子串有 b

sa[4]=2    b|b       子串有 bb

先二分查詢第k個子串大致在第幾個sa(注意「大致」),然後向下掃瞄heigt值小於子串長度lth且sa值最小的子串

#include#include#includeusing namespace std;

const int max = 100004;

int num[max];

int sa[max], rank[max], height[max];

int wa[max], wb[max], wv[max], wd[max];

int cmp(int *r, int a, int b, int l)

void da(int *r, int n, int m)

}}void calheight(int *r, int n)

}long long sub[max];

int main()

int low=1,high=len,mid,res=1;

while(low<=high)else

}//cout<<"res="<=lth)//rrr=lll+lth-1;

lll++;

rrr++;

printf("%d %d\n",lll,rrr);}}

return 0;

}

hdu5008 字尾陣列 線段樹

題意 給出乙個長度到10 6的串 現在要統計該串中第k小的不重複子串 然後找到最左端的那個 解法 字尾陣列的作用是統計每個左端點不重複的串的個數 然後用線段樹維護每個起始點的不重複子串綜合 那麼就可以求出第k個子串所在的塊了 然後就是求再這個塊中出現的最早點 這個用二分 rmq 原因很簡單 那就是 ...

hdu2328 字尾陣列 二分

題意 求 n 個串的字典序最小的最長公共子串 思路 本題中單個字串長度不超過 200,可以暴力列舉乙個字串的所有字首,然後用kmp去匹配其他字串.我這裡是用字尾陣列寫的.類似 不過本題是有 n 個字串,不能直接暴力判斷.不難想到這裡可以直接二分答案長度,不過 check 函式比較難想到,具體看 1 ...

1402 字尾陣列 (hash 二分)

描述 字尾陣列 sa 是一種重要的資料結構,通常使用倍增或者dc3演算法實現,這超出了我們的討論範圍。在本題中,我們希望使用快排 hash與二分實現乙個簡單的 o n log 2 n 的字尾陣列求法。詳細地說,給定乙個長度為 n 的字串s 下標 0 n 1 我們可以用整數 k 0 k 輸入格式 乙個...