Link
比较(s_i',s_j')只需要知道(lcp(min(i,j),min(i,j)+1))。
所以我们可以(O(n))预处理所有的结果然后sort/基数排序。
#include<cstdio>
const int N=1000007;
int las[N],pos[N],len[N];char s[N];
int main()
{
int n,L,R,c=0;
scanf("%d%s",&n,s+1);
for(int l=1,r=1;l<=n;l=r)
{
while(r<=n&&s[l]==s[r]) ++r;
++c,len[c]=r-l,s[c]=s[l],pos[c]=l-1;
}
L=R=c;
for(int i=c-1;~i;--i) s[i]>s[i+1]? (las[i]=L,L=i):(las[R]=i,R=i);
for(int p=L;p;p=las[p]) for(int i=1;i<=len[p];++i) printf("%d ",pos[p]+i);
return 0;
}