大致題意:
給出乙個長度小於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 輸入格式 乙個...