1031: [JSOI2007]字符加密Cipher

Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 4175 Solved: 1694
[Submit][Status][Discuss]
Description

喜欢钻研问题的JS 同学,近期又迷上了对加密方法的思考。一天,他突然想出了一种他觉得是终极的加密办法:把须要加密的信息排成一圈,显然,它们有非常多种不同的读法。比例如以下图,能够读作:

JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0 把它们依照字符串的大小排序: 07JSOI 7JSOI0 I07JSO JSOI07 OI07JS SOI07J 读出最后一列字符:I0O7SJ,就是加密后的字符串(事实上这个加密手段实在非常easy破解,鉴于这是突然想出来的。那就^^)。可是。假设想加密的字符串实在太长,你能写一个程序完毕这个任务吗?

Input

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

Output

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

Sample Input

JSOI07
Sample Output

I0O7SJ
HINT

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

思路:后缀数组的模板题。

我们仅仅须要先将这个串拷贝到后面,然后处理处sa,依次输出排名中的起点

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N n*2-1
const int M=200100;
char ch[M];
int n,m=0,sa[M],t1[M],t2[M],c[M];
void build_sa()
{int i,p,k,*x=t1,*y=t2;for(i=0;i<m;++i) c[i]=0;for(i=0;i<N;++i) c[x[i]=ch[i]]++;for(i=1;i<m;++i) c[i]+=c[i-1];for(i=N-1;i>=0;--i) sa[--c[x[i]]]=i;for(k=1;k<=N;k<<=1){p=0;for(i=N-k;i<N;++i) y[p++]=i;for(i=0;i<N;++i) if(sa[i]>=k) y[p++]=sa[i]-k;for(i=0;i<m;++i) c[i]=0;for(i=0;i<N;++i) c[x[y[i]]]++;for(i=0;i<m;++i) c[i]+=c[i-1];for(i=N-1;i>=0;--i) sa[--c[x[y[i]]]]=y[i];swap(x,y);p=1;x[sa[0]]=0;for(i=1;i<N;++i)x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;if(p>=N) break;m=p;}
}
int main()
{int i,j;scanf("%s",&ch);n=strlen(ch);for(i=0;i<n-1;++i) ch[i+n]=ch[i];for(i=0;i<n;++i) m=max(m,(int)ch[i]);m+=1;build_sa();for(i=0;i<N;++i)if(sa[i]<n)printf("%c",ch[sa[i]+n-1]);
}

转载于:https://www.cnblogs.com/llguanli/p/7399249.html

[bzoj1031][JSOI2007]字符加密Cipher相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. bzoj-1031 字符加密Cipher

    题意: 给出一个字符串,求将其所有循环串排序之后,每个串的最后一个字符: 字符串长度<=100000: 题解: 后缀数组裸题..吧 学长拿这个当例题我还差点不会做... 反正就是把字符串倍增之后 ...

最新文章

  1. TextBox中的KeyDown 时间不能响应的问题!
  2. mysql 全文本检索的列_Mysql 全文本检索
  3. python3.5.2使用教程_Python3.5.2-初级教程.docx
  4. ZYNQ PS端输出不准确时钟供PL使用
  5. 用汇编的眼光看c++(之模板函数)
  6. Mysql触发器与动态完整性
  7. WPF,Silverlight与XAML读书笔记第六 - WPF新概念之一逻辑树与可视树
  8. Mac上go环境变量配置
  9. 算法训练 s01串java_试题 算法训练 s01串
  10. BootStrap-datepicker日期插件
  11. COJ 0358 xjr考考你数据结构(根号3)线段树区间修改
  12. 阿里云申请商标注册步骤详细教程
  13. pfamscan 的使用_科学网—[转载]InterProScan的使用教程 - 黄顺谋的博文
  14. 计算机网络系统中常用的四对双绞线电缆,计算机网络中常用的三种有线传输媒体是什么?...
  15. 数值型数据的表示(2.0)
  16. python向量运算_2 向量的运算在Python中的实现
  17. 【游戏编程扯淡精粹】如何学习编程语言
  18. 欧姆龙nj与nx哪个高端_具备NJ/NX控制级的「史诗级工业PC」
  19. SuperZero gero同步区块进度可视化
  20. java连接 mdx,olap4j连接sap hana的xmla服务mdx查询报错【已解决】

热门文章

  1. 将java编译成so库_利用android studio 生成 JNI需要的动态库so文件
  2. cent os7 安装nginx1.16.1
  3. idea mysql删除_IntelliJ IDEA 配置Mysql5.7 带图文详解 视频讲解
  4. Python数据可视化-matplotlib and seaborn
  5. 目标检测(二十)--Mask R-CNN
  6. 系统学习数字图像处理之描绘子
  7. 项目管理实践之版本控制工具SVN
  8. python 中的运算符重载
  9. UART通信协议(三)GPIO模拟串口
  10. C语言:编写一个程序,建立一个abc.txt文本文件,向其中写入“this is a test”,然后显示该字符串