給定乙個長度為 \(n\) 的字串以及 \(q\) 組查詢, 每組查詢給定 \(a\) 和 \(b\), 求在所有本質不同子串中排名第 \(a\) 和第 \(b\) 的串的最長公共字首與最長公共字尾的平方和.
\(n,q\le 1\times 10^5\).
字尾陣列板子題.麻麻我終於會用字尾陣列辣
本來想接著用sam的...但是發現多組查詢排名為 \(k\) 的本質不同子串以我對sam的理解好像不能做...於是就用了sa.
最長公共前字尾顯然對正反串建兩個sa就可以 \(o(n\log n)\rightarrow o(1)\) 算了. 關鍵在於怎麼找到這兩個子串.
把所有字尾排序後, 顯然每乙個字尾對本質不同子串的貢獻就是和前乙個字尾相同的部分之外的部分了. 那麼求出所有 \(height\) 後我們也能知道前 \(k\) 個字尾總共產生了多少本質不同的子串. 直接二分找到子串左端點然後根據差值算出子串長度就可以了.
因為要有兩個sa, 所以簡單地封到結構體裡會比較好寫. 然而這根本不算封裝
bzoj 3230 相似子串
time limit 20 sec memory limit 128 mb submit 1767 solved 438 submit status discuss 輸入第1行,包含3個整數n,q。q代表詢問組數。第2行是字串s。接下來q行,每行兩個整數i和j。1 i j 輸出共q行,每行乙個數表示...
BZOJ3230 相似子串
3230 相似子串 time limit 20 sec memory limit 128 mb submit 913 solved 223 submit status description input 輸入第1行,包含3個整數n,q。q代表詢問組數。第2行是字串s。接下來q行,每行兩個整數i和j。...
bzoj3230 相似子串 SA lcp 二分
首先用字尾陣列處理出h陣列。因為要問子串的排名,所以我們再記乙個陣列num i 表示前i個字尾有幾個本質不同的子串。然後我們用二分查詢就可以找到排序後的第i個子串是誰了。然後就是求一下lcp了。還有反過來的lcp。算清角標就好了。還有很坑的一點 可能有超過int範圍個實質不同的字串 include ...