題目大意:給定乙個字串。每次詢問給定$t$個位置,求兩兩位置開頭的字尾的$lcp$之和。
注釋:$1\le length\le 5\cdot 10^5$,$\sum t\le 3\cdot 10^6$。
想法:
不難想到構建字尾陣列。
進而我們的問題就轉化成了給定序列上一些位置求這些位置兩兩之間區間最小值的和。
對$ht$陣列建立$st$表。
接下來的過程可以用單調棧維護。
code:
#include #include #include #include #define n 500010using namespace std; typedef long long ll;
int n,m,wa[n],wb[n],wv[n],sa[n],height[n],rank[n],r[n],ws[n];
char ch[n];
int f[21][n],l[n],vis[n],s[n],g[n];
int v[3000050],q[3000050];
ll dp[n];
inline char nc()
inline int rd()
inline int rc()
void build_sa()
printf("%lld\n",ans);
} return 0;
}
小結:字尾陣列真好玩。
BZOJ3879 SvT(字尾陣列 單調棧)
點此看題面 大致題意 給定乙個字串,每次詢問給出若干字尾,求兩兩之間的 lcp 之和。明明是想練字尾自動機的,結果看到這題一眼想到字尾陣列,而且一兩分鐘就推出了解法,因此最終默默地寫了字尾陣列。不過真的好坑啊,題目最下面寫了可能存在相同字尾,且相同字尾只計算一次答案。沒看到這句話的我白白浪費了半個小...
BZOJ 3879 SvT 虛樹 字尾樹
傳送門 題意 多次詢問,給出一些字尾,求兩兩之間 lcp 之和 哈哈哈哈哈哈哈竟然 1a 了,剛才還在想如果寫不好這道題下節數學就不上了,看來是上天讓我上數學課啊 suffix virtual tree 沒有多次詢問就是那道差異了 多次詢問總次數 o n 建出字尾樹每次建虛樹就行了 然後詢問給出的是...
BZOJ3879 SvT(字尾自動機,虛樹)
bzoj 看著這個東西,詢問若干個字首兩兩之間的 lcp 顯然 lcp 就是 sam 構建出來的 parent 數上的 lca 所代表的長度。那麼這樣子就轉為了樹型 dp 然後發現是字首?把串轉過來就是字尾了。sum t 是 o n 級別的?顯然虛樹。那麼直接虛樹搞搞就好了。include incl...