#include<bits/stdc++.h>
#define N 100050
using namespace std;
int h[N],k,j,sa[N],l,n,si,po,c[N],p[N],t[N],r[N];
char s[N];
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
si=26;
for(int i=1; i<=n; ++i)sa[i]=i,r[i]=s[i]-'a'+1;
for(;po<n;si=po)
{
po=0;
for(int i=n-l+1; i<=n; ++i)p[++po]=i;
for(int i=1; i<=n; ++i)if(sa[i]>l)p[++po]=sa[i]-l;
memset(c,0,sizeof(c));
for(int i=1; i<=n; ++i)++c[r[i]];
for(int i=1; i<=si; ++i)c[i]+=c[i-1];
for(int i=n; i; --i)sa[c[r[p[i]]]--]=p[i];
po=0;
for(int i=1; i<=n; ++i)
{
t[sa[i]]= r[sa[i]]==r[sa[i-1]] && r[sa[i]+l]==r[sa[i-1]+l] ? po : ++po;
}
memcpy(r,t,sizeof(t));
l=!l?1:l<<1;
}
for(int i=1; i<=n; ++i)printf("%d ",sa[i]); puts("");
for(int i=1; i<=n; ++i)
{
k=sa[r[i]-1];
if(!k){
j=0;
continue;
}
if(j)--j;
while(s[i+j]==s[k+j]&&j+k<=n&&i+j<=n)++j;
h[r[i]]=j;
}
for(int i=2; i<=n; ++i)printf("%d ",h[i]);
}
SA模板(uoj35)
最新推荐文章于 2018-12-02 23:16:09 发布