#include<bits/stdc++.h>
using namespace std;
string s;
const int N=300010;
int sa[N];
int x[N];
int y[N];
int c[N];
int height[N];
int rk[N];
int n,m;
void get_sa()
{
for(int i=1;i<=n;i++) ++c[x[i]=s[i]];
for(int i=1;i<=m;i++) c[i]+=c[i-1];
for(int i=n;i>=1;i--) sa[c[x[i]]--]=i;
for(int k=1;k<=n;k<<=1)
{
for(int i=1;i<=m;i++) c[i]=0;
int num=0;
for(int i=n-k+1;i<=n;i++) y[++num]=i;
for(int i=1;i<=n;i++) if(sa[i]>k) y[++num]=sa[i]-k;
for(int i=1;i<=n;i++) ++c[x[i]];
for(int i=1;i<=m;i++) c[i]+=c[i-1];
for(int i=n;i>=1;i--) sa[c[x[y[i]]]--]=y[i],y[i]=0;
swap(x,y);
x[sa[1]]=1;
num=1;
for(int i =2;i<=n;i++)
{
x[sa[i]]=(y[sa[i]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k]?num:++num);
}
if(num==n) break;
m=num;
}
for(int i=1;i<=n;i++)
rk[sa[i]]=i;
}
void get_height()
{
int k=0;
for(int i=1;i<=n;i++)
{
if(rk[i]==1 ) continue;
int j=sa[rk[i]-1];
if(k) k--;
while(i+k<=n && j+k<=n &&s[i+k]==s[j+k]) k++;
height[rk[i]]=k;
}
}
int main()
{
cin >> s;
n=s.size();
m=122;
s=" "+s;
get_sa();
get_height();
for(int i=1;i<=n;i++) cout<<sa[i]-1<<" ";
cout<<endl;
for(int i=1;i<=n;i++) cout<<height[i]<<" ";
return 0;
}
后缀数组模板
最新推荐文章于 2022-04-30 17:17:42 发布