DA后缀数组构造的思想主要的就是倍增

即类似RMQ的双关键字排序

所以就可以用双关键字排序的方法来构造后缀数组

基数排序和快排都可以,鉴于是1e5,直接nlogn就够了

码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 500005
int rk[N],len,n,i,k,cnt;
char str[N];
struct SA
{int x,y,id;
}sa[N];
bool cmp(SA a,SA b)
{if(a.x==b.x)return a.y<b.y;return a.x<b.x;
}
void Da2()
{for(i=0;i<n;i++)sa[i].x=str[i],sa[i].id=i;for(k=1;k<n;k*=2){for(i=0;i<n;i++)sa[i].y=sa[i+k].x;//得到第二关键字   sort(sa,sa+n,cmp);//排序 cnt=0;for(i=0;i<n;i++){if(sa[i].x==sa[i-1].x&&sa[i].y==sa[i-1].y);else cnt++;rk[sa[i].id]=cnt;}for(i=0;i<n;i++)sa[i].x=rk[i],sa[i].id=i;      }
}
int main()
{scanf("%s",str);len=strlen(str);for(i=len;i<len*2-1;i++)str[i]=str[i-len];n=len*2-1;Da2();sort(sa,sa+n,cmp);for(i=0;i<n;i++){if(sa[i].id<len)printf("%c",str[sa[i].id+len-1]);}
}

bzoj1031 [JSOI2007]字符加密 后缀数组改相关推荐

  1. BZOJ1031: [JSOI2007]字符加密Cipher

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7882  Solved: 3425 [Subm ...

  2. [bzoj1031][JSOI2007]字符加密Cipher

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4175 Solved: 1694 [Submit ...

  3. 【BZOJ1031】[JSOI2007]字符加密Cipher 后缀数组

    [BZOJ1031][JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的 ...

  4. BZOJ 1031: [JSOI2007]字符加密Cipher( 后缀数组 )

    为什么我的后缀数组跑得这么慢... 把字符串复制一遍放在最后, 然后跑sa, 扫一遍就行了... --------------------------------------------------- ...

  5. 后缀数组(bzoj 1031: [JSOI2007]字符加密Cipher)

    后缀数组主要功能: 长度为n的字符串总共有n个后缀,求这n个后缀的字典序 实现方法:倍增+基数排序,过程就是下面那张表 求log(n)次rank数组,每次的rank数组都可以通过上次的rank数组得出 ...

  6. 【BZOJ】1031: [JSOI2007]字符加密Cipher(后缀数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1031 很容易想到这就是将字符串复制到自己末尾然后后缀数组搞出sa然后按区间输出即可. 然后换了下模板 ...

  7. 【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1031 [题意] [题解] 后缀数组模板题; 把整个字符串扩大一倍. 即长度乘2 然后搞 ...

  8. bzoj 1031 [JSOI2007]字符加密Cipher 后缀数组

    题面 题目传送门 解法 后缀数组模板题吧-- 将字符串两倍,然后求一遍sa数组即可 时间复杂度:\(O(n\ log\ n)\) 代码 #include <bits/stdc++.h> # ...

  9. 【Tyvj3500】【BZOJ1031】字符加密,后缀数组

    Time:2016.05.22 Author:xiaoyimi 转载注明出处谢谢 传送门1 传送门2 思路: 非常裸的题目了,连height数组都不用 把原串后面再接上一个原串,得到一个长度为原串两倍 ...

最新文章

  1. shell编程题(四)
  2. mysql 图片base64_关于图片的Base64编码
  3. oracle存储过程function,oracle 存储过程跟function
  4. Qt工作笔记-MySQL获取select表头(域)数据
  5. python数据检索_python – Hachoir – 从组中检索数据
  6. 画对数幅频曲线_耳机频响曲线如何看(中)--耳机和音箱对频响和失真的要求的差异...
  7. oracle12c集群安装—grid安装
  8. 软件测试面试题(二):Jmeter面试
  9. 百度拼音输入法 v2.10.2.52 官方免费版
  10. 一款非常好看的婚纱请柬设计英文字体
  11. 基础算法:数的三次方根—浮点二分
  12. win10系统下mysql5.7初始化失败怎么办?
  13. 新唐NUC980网络设置
  14. python智能光环板_什么是光环板?
  15. WeChat 聊天记录从一台手机转移到另外一台手机的注意事项
  16. KSO-在js中文本框只允许输入数字
  17. 数据中心液冷方式优缺点对比及浸没式液冷表面强化处理
  18. 以 gensim 訓練中文詞向量
  19. 蓝桥杯试题 基础练习 数列特征python
  20. 安全帽识别系统的应用

热门文章

  1. Java虚拟机------JVM介绍
  2. 2021-07-12 原来我用的是CPU,更改方法
  3. 本地远程连接阿里云Windows服务器并上传文件的方法
  4. 将华氏温度转化成摄氏度和绝对温度
  5. python安装第三方库时报错 SyntaxError: invalid syntax
  6. mysql并行加载机制_Mysql表引擎优化
  7. tomcat远程调试_docker容器远程debug(Tomcat)
  8. php时间转两位数年份,PHP常用时间函数资料整理
  9. c++ 协程_Python3 协程(coroutine)介绍
  10. android应用测试与调试实战_实战 | Java 服务端和 Android 端手工测试覆盖率统计的实现...