比赛 |
清华集训2017模板练习 |
评测结果 |
AAAAAAAAAA |
题目名称 |
后缀排序 |
最终得分 |
100 |
用户昵称 |
Cydiater |
运行时间 |
1.655 s |
代码语言 |
C++ |
内存使用 |
18.31 MiB |
提交时间 |
2017-07-17 14:29:41 |
显示代码纯文本
//SA
//by Cydiater
//2017.7.17
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
#define FILE "sais"
const int MAXN=1e6+5;
const int oo=0x3f3f3f3f;
int N;
char s[MAXN];
namespace SA{
int sa[MAXN],rnk[MAXN],tmp[MAXN],cnt[MAXN],p[MAXN];
inline bool equ(int x,int y,int l){return rnk[x]==rnk[y]&&rnk[x+l]==rnk[y+l];}
void Build(){
scanf("%s",s+1);
N=strlen(s+1);
up(i,1,N){
sa[i]=i;
rnk[i]=s[i];
}
for(int l=0,pos,sig=300;pos<N;sig=pos){
pos=0;
up(i,N-l+1,N)p[++pos]=i;
up(i,1,N)if(sa[i]>l)p[++pos]=sa[i]-l;
up(i,0,sig)cnt[i]=0;
up(i,1,N)cnt[rnk[i]]++;
up(i,1,sig)cnt[i]+=cnt[i-1];
down(i,N,1)sa[cnt[rnk[p[i]]]--]=p[i];
pos=0;
up(i,1,N)tmp[sa[i]]=equ(sa[i],sa[i-1],l)?pos:++pos;
up(i,1,N)rnk[i]=tmp[i];
l=!l?1:(l<<1);
}
}
}using namespace SA;
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
SA:Build();
up(i,1,N)printf("%d ",sa[i]-1);
puts("");
return 0;
}