后缀数组

Posted zgqblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后缀数组相关的知识,希望对你有一定的参考价值。

对于后缀有关的东西,本人一无所知。

如果你点击进来这博客,那请你谨慎阅读。

本菜鸡在开开心心刷沈大佬给我拉的铜牌题专题的时候,突然遇到了一到后缀自动机的题,不过,我完全不会。上网搜索资料的时候,我看到了后缀数组,后缀自动机,后缀树这几个东西,我也不知道他们是干什么的,也不知道他们的难度如何,于是就找了一个看起来最简单的来学一下。

此博客会基于挑战,谈一些自己现在的理解。由于是本菜鸡的初步理解,再次重申,请谨慎阅读!!

所谓后缀数组,就是先拿到某个数组的所有后缀,给他们加上一个标号id,再将他们排个序,最后得到id的序列就是后缀数组。

请大家看一下我的暴力代码:

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string s;
const int maxn = 10086;
struct node
{
    string ss;
    int id;
}sa[maxn];

bool cmp(node x,node y)
{
    return x.ss<y.ss;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>s;
    int l=s.length();
    for(int  i=l;i>=0;i--){
        sa[i].ss=sa[i+1].ss;
        sa[i].ss.insert(sa[i].ss.begin(),s[i]);//得到后缀
        sa[i].id=i;//打上标号
    }

    sort(sa,sa+l+1,cmp);//根据后缀排序

    //最后,id顺序就是后缀数组的内容
    for(int i=0;i<=l;i++){
        cout<<sa[i].id<<" ";
    }
    cout<<endl;
    return 0;
}

  这样的暴力时间复杂度取决于string的插入操作,其他的地方就只有一个sort有nlog(n)的复杂度,本菜鸡并不知道string的复杂度是多少,不过据我分析,应该是n2的。

就此而言,整个算法的时间复杂度就应该是n2的。

所以,挑战上给我们介绍了一种nlog2n的算法。

整个算法的过程挑战已经说得非常清楚了,在P378.所以我会再次讲解一下他的代码。

一下代码是一个一个字直接打出来,但愿我没有抄错,不过测了一点数据,和暴力的输出是一样的。

 

 

 

//未完待续

以上是关于后缀数组的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段—— 数组的响应式方法

VSCode自定义代码片段10—— 数组的响应式方法

Sublime Text3自定义代码片段

后缀数组代码详解

●后缀数组○十三个例题

初学后缀数组记录(然而并不是很会。。&&很水。。)