int n,m;
int height[maxn];
char s[maxn];
int rak[maxn],sa[maxn],tp[maxn],tax[maxn];
void bucket() //桶排序
{
for(int i=0; i<=m; ++i) tax[i]=0;
for(int i=1; i<=n; ++i) tax[rak[i]]++;
for(int i=1; i<=m; ++i) tax[i]+=tax[i-1];
for(int i=n; i>=1; i--)
sa[tax[rak[tp[i]]]--]=tp[i];
}
void get_sa()
{
m=128;
for(int i=1; i<=n; i++) rak[i]=s[i],tp[i]=i;
bucket();
for(int w=1,p=0; p<n; m=p,w<<=1)
{
p=0;
for(int i=1; i<=w; i++) tp[++p]=n-w+i;
for(int i=1; i<=n; i++)
if(sa[i]>w) tp[++p]=sa[i]-w;
bucket();
swap(tp,rak);
rak[sa[1]]=p=1;
for(int i=2;i<=n;++i)
rak[sa[i]]=(tp[sa[i-1]]==tp[sa[i]] && tp[sa[i-1]+w]==tp[sa[i]+w])?p:++p;
}
}
void get_height()
{
int k=0;
for(int i=1;i<=n;++i)
{
if(k) k--;
int j=sa[rak[i]-1];
while(s[i+k]==s[j+k]) ++k;
height[rak[i]]=k;
}
}
05-11
852