Luogu P5329 [SNOI2019]字符串

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;
}
原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12220614.html