洛谷P3809 【模板】后缀排序

本文详细介绍了洛谷P3809题目的解决方案——后缀排序,探讨了使用标准模板库(STL)中sort函数的局限性,即其O(n^2logn)的时间复杂度,并提出了一种更高效的后缀排序算法,通过实例代码展示了如何实现这一算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

洛谷P3809 【模板】后缀排序

 

这里,仅仅介绍一下如何进行字符串的后缀排序

$STL$ 中的 $sort$ ? 想得美 $!$

由于 $sort$ 函数在比较字符串大小时会将字符串的每一个字

符逐一比较,整体复杂度便是 $O(n^2logn)$ .

我们需要一个更快的方法来对后缀排序.

由于不太好讲,我就不讲啦QAQ...

 

Code:

#include <cstdio>
#include <algorithm>
#include <cstring>
#define setIO(s) freopen(s".in","r",stdin) 
#define maxn 1000013
using namespace std;
char str[maxn];
int a[maxn],rk[maxn],sa[maxn],tp[maxn],tax[maxn],n,m;

void read(){
    scanf("%s",str);
    n=strlen(str);
    for(int i=0;i<n;++i) a[i+1]=str[i]; 
}
void qsort(){
    for(int i=0;i<=m;++i) tax[i]=0;
    for(int i=1;i<=n;++i) ++tax[rk[tp[i]]]; 
    for(int i=1;i<=m;++i) tax[i]+=tax[i-1];
    for(int i=n;i>=1;--i) sa[tax[rk[tp[i]]]--]=tp[i]; 
}
void suffix(){
    for(int i=1;i<=n;++i) rk[i]=a[i],tp[i]=i; 
    qsort(); 
    for(int k=1;k<=n;k<<=1){
        int num=0;
        for(int i=n-k+1;i<=n;++i)tp[++num]=i;
        for(int i=1;i<=n;++i) if(sa[i]>k) tp[++num]=sa[i]-k; 
        qsort();
        swap(rk,tp);
        rk[sa[1]]=1;
        num=1;
        for(int i=2;i<=n;++i) 
            rk[sa[i]]=(tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+k]&&tp[sa[i]+k]==tp[sa[i-1]+k])?num:++num;
        if(num==n) break;
        m=num;  
    }
    return; 
}
int main(){
    //setIO("input"); 
    read();
    m=122; 
    suffix(); 
    for(int i=1;i<=n;++i) printf("%d ",sa[i]);
    return 0; 
}

  

posted @ 2019-01-14 14:57 EM-LGH 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值