【解题思路】

  将原串复制一份拼接到原串后作为处理串,可以对处理串的前一半后缀排序,即可得出顺序。复杂度O(Llog2L)。

【参考代码】

  也是naive的时候写的。。后缀数组居然是用桶排求的。。

 #pragma optimize(2)
#include <cstdio>
#include <cstring>
#include <vector>
#define REP(I,start,end) for(int I=(start);I<=(end);I++)
#define PER(I,start,end) for(int I=(start);I>=(end);I--)
using namespace std;
typedef vector<int> vecint;
vecint srt[];
int suffix[],rank[],srnk[];
char st[];
int main()
{
scanf("%s",st);
int n=strlen(st);
memset(srt,,sizeof(srt));
REP(i,,n)
srt[st[i-]].push_back(i);
int cnt=,tot=;
REP(i,,)
if(!srt[i].empty())
{
cnt++;
for(vecint::iterator it=srt[i].begin();it!=srt[i].end();it++)
{
int now=*it;
suffix[++tot]=now;
rank[now]=cnt;
}
}
for(int i=;i<n;i<<=)
{
memset(srt,,sizeof(srt));
REP(j,,n)
{
int now=i+j;
now-=(now>n)*n;
srt[rank[now]].push_back(j);
}
tot=cnt=;
REP(j,,n)
if(!srt[j].empty())
{
cnt++;
for(vecint::iterator it=srt[j].begin();it!=srt[j].end();it++)
{
int now=*it;
suffix[++tot]=now;
srnk[now]=cnt;
}
}
memset(srt,,sizeof(srt));
REP(j,,n)
srt[rank[suffix[j]]].push_back(suffix[j]);
cnt=tot=;
REP(j,,n)
if(!srt[j].empty())
{
int last=-;
for(vecint::iterator it=srt[j].begin();it!=srt[j].end();it++)
{
int now=*it,pnt=srnk[now];
cnt+=pnt>last;
last=pnt;
suffix[++tot]=now;
rank[now]=cnt;
}
}
}
REP(i,,n)
putchar(st[(suffix[i]+n-)%n]);
putchar('\n');
return ;
}

最新文章

  1. 利用Python进行数据分析(2) 尝试处理一份JSON数据并生成条形图
  2. iOS 3DES加密解密(一行代码搞定)
  3. 全球最受欢迎的十大Linux发行版(图)
  4. [转]Oracle开发专题之:%TYPE 和 %ROWTYPE
  5. PHP获取IP所在地区(转)
  6. JDBC——事物管理
  7. bzoj有趣的题目
  8. Android WifiDisplay分析一:相关Service的启动
  9. Java经典编程题50道之十四
  10. Centos扩容swap分区
  11. STM32库函数void USART_SendData的缺陷和解决方法
  12. Auto Layout - BNR
  13. 关于查询中查询无果,也不报错,inpout标签中的value属性为‘ ’的判断问题
  14. 41_redux_counter应用_react-redux版本
  15. 【Spark工作原理】stage划分原理理解
  16. Java -- JDBC 学习--通过 ResultSet 执行查询操作
  17. Linux下编译安装Lnmp
  18. 【LOJ】#2270. 「SDOI2017」天才黑客
  19. 原生javascript封装的函数
  20. centos7 在docker swarm中运行Jenkins,利用gitlab的webhook触发自动部署脚本

热门文章

  1. logo的普遍写法
  2. Nginx配置PHP环境支持
  3. 【Linux】windows下编写的脚本文件,放到Linux中无法识别格式
  4. 【NOI2019模拟2019.6.29】组合数(Lucas定理、数位dp)
  5. Andrdoid中对应用程序的行为拦截实现方式之----从底层C进行拦截
  6. 戏说 .NET GDI+系列学习教程(三、Graphics类的应用_验证码扩展)
  7. 1060 Are They Equal (25 分)
  8. Lucene字段
  9. NIO 源码分析(02-1) BIO 源码分析
  10. JHipster研究