据说可以压缩几个for,但是没找到咋整。
void work(){
for(re int i=1;i<=n;++i) rk[i]=s[i]-'a'+1,++bu[rk[i]];
for(re int i=2;i<=lim;++i) bu[i]+=bu[i-1];
for(re int i=n;i>=1;--i) SA[bu[rk[i]]--]=i;
for(re int k=1;k<=n;k<<=1){
ll cnt=0;
for(re int i=1;i<=k;++i) w2[++cnt]=n-k+i;
for(re int i=1;i<=n;++i)
if(SA[i]>k) w2[++cnt]=SA[i]-k;
for(re int i=1;i<=lim;++i) bu[i]=0;
for(re int i=1;i<=n;++i) bu[rk[i]]++;
for(re int i=2;i<=lim;++i) bu[i]+=bu[i-1];
for(re int i=n;i>=1;--i) SA[bu[rk[w2[i]]]--]=w2[i];
swap(rk,w2);
cnt=1,rk[SA[1]]=1;
for(re int i=2;i<=n;++i)
rk[SA[i]]=(w2[SA[i-1]]==w2[SA[i]]&&w2[SA[i-1]+k]==w2[SA[i]+k])?cnt:++cnt;
if(cnt==n) break;
lim=cnt;
}
}
不会SA-IS,只想卡常。