后缀数组
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.所以我会再次讲解一下他的代码。
一下代码是一个一个字直接打出来,但愿我没有抄错,不过测了一点数据,和暴力的输出是一样的。
//未完待续
以上是关于后缀数组的主要内容,如果未能解决你的问题,请参考以下文章