RT,想知道树上后缀排序时,height数组是否可以像常规后缀排序一样使用LCP Theroem求出,还是说只能写二分+哈希?
如果答案是可以的话,能帮忙看一下这段代码为何会挂吗?其中rt是树根(除了树根外其它节点上都有字符,因此计算height时到rt就应该停止了);s是节点上的字符,anc数组是倍增的祖先数组,ANC函数通过树上倍增找到k级祖先,dep数组是深度数组(同理,不包括树根)。
for(int i=1,k=0;i<=n;i++){
if(rk[i]==1)continue;
if(k)k--;
k=min(k,dep[i]),k=min(k,dep[sa[rk[i]-1]]);
int u=ANC(i,k),v=ANC(sa[rk[i]-1],k);
while(u!=rt&&v!=rt&&s[u]==s[v])k++,u=anc[u][0],v=anc[v][0];
ht[rk[i]]=k;
}