Brief Description

给定一个长度为n的字符串,你需要对其进行加密。

  1. 把字符串围成一个环
  2. 显然从任意一个位置开始都可以有一个长度为n的串
  3. 把产生的n个串按字典序排序,把这n个串的最后一个字符顺接起来就得到了加密后的串。

Algorithm Design

看到环的题目,可以想到破环为链,我们把原串复制一份贴在后面,求这个串的SA,可以知道这个新串的SA扫一遍就得到了解。

然后这个题就做完了。

Code

  1. #include <cstdio>
  2. #include <cstring>
  3. const int maxn = 200010;
  4. char ch[maxn];
  5. int a[maxn], n, k;
  6. int v[maxn], sa[2][maxn], rank[2][maxn];
  7. void init() {
  8. scanf("%s", ch + 1);
  9. n = strlen(ch + 1);
  10. for (int i = 1; i <= n; i++) {
  11. a[i] = (int)ch[i];
  12. a[i + n] = a[i];
  13. ch[i + n] = ch[i];
  14. }
  15. n <<= 1;
  16. }
  17. void calcsa(int sa[maxn], int rank[maxn], int SA[maxn], int RANK[maxn]) {
  18. for (int i = 1; i <= n; i++)
  19. v[rank[sa[i]]] = i;
  20. for (int i = n; i >= 1; i--)
  21. if (sa[i] > k)
  22. SA[v[rank[sa[i] - k]]--] = sa[i] - k;
  23. for (int i = n - k + 1; i <= n; i++)
  24. SA[v[rank[i]]--] = i;
  25. for (int i = 1; i <= n; i++) {
  26. RANK[SA[i]] = RANK[SA[i - 1]] + (rank[SA[i - 1]] != rank[SA[i]] ||
  27. rank[SA[i - 1] + k] != rank[SA[i] + k]);
  28. }
  29. }
  30. void work() {
  31. int p = 0, q = 1;
  32. for (int i = 1; i <= n; i++)
  33. v[a[i]]++;
  34. for (int i = 1; i <= 256; i++)
  35. v[i] += v[i - 1];
  36. for (int i = 1; i <= n; i++)
  37. sa[p][v[a[i]]--] = i;
  38. for (int i = 1; i <= n; i++)
  39. rank[p][sa[p][i]] =
  40. rank[p][sa[p][i - 1]] + (a[sa[p][i]] != a[sa[p][i - 1]]);
  41. k = 1;
  42. while (k < n) {
  43. calcsa(sa[p], rank[p], sa[q], rank[q]);
  44. p ^= 1;
  45. q ^= 1;
  46. k <<= 1;
  47. }
  48. for (int i = 1; i <= n; i++) {
  49. if (sa[p][i] <= n / 2)
  50. printf("%c", ch[sa[p][i] + n / 2 - 1]);
  51. }
  52. printf("\n");
  53. }
  54. int main() {
  55. #ifndef ONLINE_JUDGE
  56. freopen("input", "r", stdin);
  57. #endif
  58. init();
  59. work();
  60. return 0;
  61. }

[bzoj1031][JSOI2007]字符加密Cipher——后缀数组的更多相关文章

  1. [BZOJ1031] [JSOI2007] 字符加密Cipher (后缀数组)

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

  2. BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题

    BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include &l ...

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

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

  4. 【BZOJ-1031】字符加密Cipher 后缀数组

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5504  Solved: 2277[Submit ...

  5. BZOJ 1031 [JSOI2007]字符加密Cipher 后缀数组教程

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

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

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6014  Solved: 2503[Submit ...

  7. [bzoj1031][JSOI2007]字符加密Cipher_后缀数组

    字符加密Cipher bzoj-1031 JSOI-2007 题目大意:题目链接. 注释:略. 想法: 后缀数组裸题啊. 后缀数组其实背下来板子之后有几个数组记住就可以了. $sa_i$表示排名为$i ...

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

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

  9. bzoj 1031 [JSOI2007]字符加密Cipher 后缀数组模板

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

随机推荐

  1. 【Luogu P4644】Cleaning Shifts

    题目 给定 \(n\) 个区间 \([a_i, b_i]\), 花费为 \(c_i\), 求覆盖 \([L, R]\) 区间的所有整数的最小花费. \(0\le n \le 10^4, 0\le L, ...

  2. 「暑期训练」「Brute Force」 Optimal Point on a Line (Educational Codeforces Round 16, B)

    题意 You are given n points on a line with their coordinates $x_i$. Find the point x so the sum of dis ...

  3. svm+voting

    # encoding:utf-8 import getopt from sklearn.preprocessing import MinMaxScaler import os,time from mu ...

  4. 线段树——hdu1166敌兵布阵

    一.题目回顾 题目链接:敌兵布阵 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个 ...

  5. C#编译和运行原理

    关于编译与内存的关系,以及执行时内存的划分 1.所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的 常量),它们所需要的空间大小可以明确计 ...

  6. flex builder 4

    下载地址(需要登录):http://trials.adobe.com/AdobeProducts/FLBR/4/win32/FlashBuilder_4_LS10.exe 很全的在线帮助文档:http ...

  7. iOS银联,支付宝,微信,ping++开发文档

    银联支付 银联支付目测只需两个参数 1.tn 其实就是订单号 2.mode 是测试环境还是线上环境 开发步骤 1.首先客户端浏览商品,点击下单,请求到达商户后台 2.商户后台在提交订单信息到银联后台 ...

  8. Redis数据类型及操作详解

    Redis数据库,是nosql的一种.与传统关系型数据库(如mysql.sqlserver等)相比,他在处理大数据量上相当有优势,扩展性和可用性高,这是传统型数据库所达不到的. Redis是一个key ...

  9. Chromium学习笔记

    1. How to build chromium Follow the steps on:http://www.chromium.org/Home 需要安装Win7 x64的OS,PC的配置尽可能高端 ...

  10. Java面试题-字符串操作

    题目:输入一行字符,分别统计出其中英文字母,空格,数字和其他字符个数 //创建一个容器,用来保存结果,英文字母空格数组和其他字符做key,个数为value Map<String,Integer& ...