用的 sais
照着 oi-wiki 上敲得,#5 过不去,下完数据后发现是 height 求错了
void init(char *s,int len,int sigma) {
int *LMS=new int[len];
sais(s,len+1,LMS,sigma);
delete[] LMS;
for (int i=0;i<len;i++) sa[i]=sa[i+1];
for (int i=0;i<len;i++) rk[sa[i]]=i;
for (int i=0,k=0;i<len;i++) {
if (!rk[i]) continue;
if (k) --k;
while (s[i+k]==s[sa[rk[i]-1]+k]) ++k;
h[rk[i]]=k;
st[rk[i]][0]=k;
}
for (int j=1;j<26;j++)
for (int i=0;i+(1<<j)-1<len;i++) st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}