如果你用 SA, 不要把复制数组时的 (n<<1) 写成 (1<<n) /kx
以及注意并查集 merge 时注意边界 0 (见其他hack帖).
for(int l=1;l<n;l<<=1)
{
Sort(l);Sort(0);
For(i,1,(1<<n)) ork[i]=rk[i]; m=0;
For(i,1,n)
if(i && ork[sa[i]]==ork[sa[i-1]] && ork[sa[i]+l]==ork[sa[i-1]+l]) rk[sa[i]]=m;
else rk[sa[i]]=++m;
if(m==n) break;
}