普通後綴數組的倍增構建
對於單個字符串上的後綴數組的建造,一般都是倍增一個長度
trie上後綴數組的倍增構建
對於一個trie,我們同樣可以通過倍增來求,只要把在序列上倍增
似乎在trie上SA建H數組有點不好搞,怎麼辦呢?沒事,我們有波蘭表!對於相鄰的兩個後綴,我們可以用記錄下來的
代碼大概是這樣:
void build() {
rep (i , 1 , n) rk[i][0] = str[i];
rep (i , 1 , n) pa[i][0] = fa[i];
rep (j , 1 , lg) {
rep (i , 1 , n)
pos[i] = mp(mp(rk[i][j - 1] , rk[pa[i][j - 1]][j - 1]) , i) ,
pa[i][j] = pa[pa[i][j - 1]][j - 1];
sort(pos + 1 , pos + n + 1);
rk[pos[1].sec][j] = 1;
int p = 1;
rep (i , 2 , n)
rk[pos[i].sec][j] = (pos[i - 1].fir == pos[i].fir) ? p : ++ p;
}
}
int LCP(int u , int v) {
if (u == v)
dep[u];
int l = 0;
per (i , lg , 0) if (rk[u][i] == rk[v][i]) {
l += 1 << i;
u = pa[u][i] , v = pa[v][i];
}
return l;
}