Description

喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法
:把需要加密的信息排成一圈,显然,它们有很多种不同的读法。例如下图,可以读作:

JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0把它们按照字符串的大小排序:07JSOI 7JSOI0 I07JSO JSOI07
OI07JS SOI07J读出最后一列字符:I0O7SJ,就是加密后的字符串(其实这个加密手段实在很容易破解,鉴于这是
突然想出来的,那就^^)。但是,如果想加密的字符串实在太长,你能写一个程序完成这个任务吗?

Input

  输入文件包含一行,欲加密的字符串。注意字符串的内容不一定是字母、数字,也可以是符号等。

Output

  输出一行,为加密后的字符串。

Sample Input

JSOI07

Sample Output

I0O7SJ

HINT

  对于100%的数据字符串的长度不超过100000。

Source

Solution

  题意中所谓的顺序,其实就是把字符串复制一遍后的$sa$值,每个字符串的最后一个字符对应的就是$s[sa[i]+n-1]$

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 char s[200005];
 4 int sa[200005], wv[2][350005], tong[200005];
 5
 6 bool cmp(int *tmp, int x, int y, int j)
 7 {
 8     return tmp[x] == tmp[y] && tmp[x + j] == tmp[y + j];
 9 }
10
11 void getsa(int n, int m)
12 {
13     int p = 0, *x = wv[0], *y = wv[1];
14     for(int i = 0; i < n; ++i)
15         ++tong[x[i] = s[i]];
16     for(int i = 1; i < m; ++i)
17         tong[i] += tong[i - 1];
18     for(int i = n - 1; ~i; --i)
19         sa[--tong[x[i]]] = i;
20     for(int j = 1; p != n; j <<= 1, m = p)
21     {
22         p = 0;
23         for(int i = n - j; i < n; ++i)
24             y[p++] = i;
25         for(int i = 0; i < n; ++i)
26             if(sa[i] >= j) y[p++] = sa[i] - j;
27         for(int i = 0; i < m; ++i)
28             tong[i] = 0;
29         for(int i = 0; i < n; ++i)
30             ++tong[x[y[i]]];
31         for(int i = 1; i < m; ++i)
32             tong[i] += tong[i - 1];
33         for(int i = n - 1; ~i; --i)
34             sa[--tong[x[y[i]]]] = y[i];
35         swap(x, y), p = 1, x[sa[0]] = 0;
36         for(int i = 1; i < n; ++i)
37             x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1 : p++;
38     }
39 }
40
41 int main()
42 {
43     int n;
44     cin >> s;
45     n = strlen(s);
46     for(int i = 0; i < n; ++i)
47         s[i + n] = s[i];
48     getsa(n << 1 | 1, 128);
49     for(int i = 1; i <= n << 1; ++i)
50         if(sa[i] < n) cout << s[sa[i] + n - 1];
51     cout << endl;
52     return 0;
53 }

View Code

转载于:https://www.cnblogs.com/CtrlCV/p/5540849.html

[BZOJ1031] [JSOI2007] 字符加密Cipher (后缀数组)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【洛谷 P4051】 [JSOI2007]字符加密(后缀数组)

    题目链接 两眼题.. 第一眼裸SA 第二眼要复制一倍再跑SA. 一遍过.. #include <cstdio> #include <cstring> #include < ...

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

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

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

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

最新文章

  1. 太鸡冻了!我用 Python 偷偷查到暗恋女生的名字
  2. app:compileDebugJavaWithJavac
  3. 神在夏至祭降下了神谕(oracle)
  4. java.io.file()_Java IO(一):IO和File
  5. android 读写文件 简书,Android10 文件操作适配
  6. matlab 预测值一样,matlab BP神经网络建造如下,预测时,预测值反归一化报错,求大神指教!!!!!...
  7. 核心动画——CAAnimation
  8. mysql查询语法错误_MySQL内部联接查询语法错误
  9. ②⓪②⓪ → ②⓪②①
  10. 频率学派与贝叶斯学派的区别
  11. 内网通手动修改积分_WooCommerce微信小程序2.9.4版本发布 拼团积分购适配可变产品 微信搜索推送...
  12. oracle表空间加密
  13. java.util.zip.ZipException: invalid stored block lengths的错误
  14. Android性能优化之启动速度优化
  15. OpenGL(十五)——Qt OpenGL三种不同的纹理滤波方式、光照、物体的移动
  16. IOS系统降级小工具
  17. 关于linux下VNC服务的一些介绍(本文章是基于tigervnc)
  18. 几种经典的卷积神经网络
  19. Android源码解析之日志系统Logcat
  20. pandas小节 索引,排序

热门文章

  1. spring boot 相关快捷内置类和配置
  2. oracle触发器和存储过程的格式
  3. 在线教育工具—白板系统的迭代1——bug监控排查
  4. form表单序列化后的数据转json对象
  5. POJ_3273_Monthly_Expense_(二分,最小化最大值)
  6. ESS And 迅雷5 让我不能上网
  7. vue使用element案列
  8. RabbitMQ之Exchange Direct模式
  9. 软件需求与分析——大二下需会知识点
  10. 团队编程项目作业4-开发文档