题目链接
两眼题。。
第一眼裸SA
第二眼要复制一倍再跑SA。
一遍过。。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1000010;
int sa[MAXN], x[MAXN], c[MAXN], y[MAXN], n, m = 122, q[MAXN], out[MAXN];
char s[MAXN];
int cmp(const int a, const int b){return x[a] < x[b];
}
int main(){scanf("%s", s + 1);n = strlen(s + 1);for(int i = 1; i <= n; ++i) s[i + n] = s[i];n <<= 1;for(int i = 1; i <= n; ++i) ++c[x[i] = s[i]];for(int i = 2; i <= m; ++i) c[i] += c[i - 1];for(int i = 1; i <= n; ++i)     sa[c[x[i]]--] = i;for(int k = 1; k <= n; k <<= 1){int num = 0;for(int i = n; i >= n - k + 1; --i) y[++num] = i;for(int i = 1; i <= n; ++i) if(sa[i] > k) y[++num] = sa[i] - k;for(int i = 1; i <= m; ++i) c[i] = 0;for(int i = 1; i <= n; ++i) ++c[x[i]];for(int i = 2; i <= m; ++i) c[i] += c[i - 1];for(int i = n; i; --i) sa[c[x[y[i]]]--] = y[i]; memcpy(y, x, sizeof x);x[sa[1]] = 1; num = 1;for(int i = 2; i <= n; ++i)x[sa[i]] = (y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k]) ? num : ++num;if(num == n) break;m = num;}n >>= 1;for(int i = 1; i <= n; ++i) q[i] = i;sort(q + 1, q + n + 1, cmp);for(int i = 1; i <= n; ++i)printf("%c", s[q[i] + n - 1]);return 0;
}

转载于:https://www.cnblogs.com/Qihoo360/p/10306537.html

【洛谷 P4051】 [JSOI2007]字符加密(后缀数组)相关推荐

  1. bzoj1031 [JSOI2007]字符加密 后缀数组改

    DA后缀数组构造的思想主要的就是倍增 即类似RMQ的双关键字排序 所以就可以用双关键字排序的方法来构造后缀数组 基数排序和快排都可以,鉴于是1e5,直接nlogn就够了 码: #include< ...

  2. 洛谷P3763 [Tjoi2017]DNA 【后缀数组】

    题目链接 洛谷P3763 题解 后缀数组裸题 在BZOJ被卡常到哭QAQ #include<algorithm> #include<iostream> #include< ...

  3. 洛谷 P4094 [HEOI2016/TJOI2016]字符串 后缀数组+二分+主席树

    题目链接 后缀数组 题目分析: sa[i] – 第i小的后缀的编号 rank[i] --编号为i的后缀排第几: height[i] – 第i和第i-1的最长lcp最长公共前缀: 1.二分答案,答案肯定 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Python测试框架pytest(05)fixture - error和failed、fixture实例化、多个fixture
  2. iOS之CAGradientLayer属性简介和使用
  3. python使用for循环打印99乘法表-python3:使用for循环打印九九乘法表
  4. WIN8、WIN7访问Windows Server 2003服务器的数据库速度很慢、远程速度很慢的解决方法...
  5. 请写一个java程序实现线程连接池功能_请写一个java程序实现线程连接池功能
  6. python,tensorflow,CNN实现mnist数据集的训练与验证正确率
  7. android自定义pickerview,一个非常好用的Android PickerView库
  8. debug常规的基本使用
  9. linux面试命令问题,面试常见的Linux命令及问题整理
  10. dirent struct_dirent和DIR 结构体 --- 表示文件夹中目录内容信息
  11. HDU - Polygons(半平面交)
  12. color-thief-php提取图片色值分布及百分占比
  13. Mac 判断终端是否走了代理服务器的方法
  14. Hadoop之——伪分布安装
  15. 清空input的type为file时的值
  16. 数组元素循环左移n个位置(JAVA)
  17. 切图案例实操课程二-姜威-专题视频课程
  18. 马尔萨斯模型的分析和应用
  19. Windows快捷键操作
  20. 登陆表单中添加点击刷新的验证码

热门文章

  1. 集群系统 刀片服务器,刀片服务器集群原理
  2. python的类包括_Python的类,复杂吗
  3. java中负数取整_Java取整,固定保留两位小数,适配负数、金融数字。
  4. 多线程之继承Thread类及多线程内存分析
  5. netty源码解解析(4.0)-3 Channel的抽象实现
  6. HDOJ 4876 ZCC loves cards
  7. DataGridView DataSource 如何实现排序
  8. JS中NaN、null、Undefined区别
  9. 3、PV、UIP、UV指的是什么
  10. QT中使用OpenGL绘制图形