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;
}
上一篇:POJ 1915


下一篇:一本通 高手训练 1763 简单树 可持久化线段树 树链刨分 标记永久化