bzoj 1031: [JSOI2007]字符加密Cipher 後綴數組模板題
1031: [JSOI2007]字符加密Cipher
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3157 Solved: 1233
[Submit][Status]
Description
喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法。例如下图,可以读作:

JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0 把它们按照字符串的大小排序: 07JSOI 7JSOI0 I07JSO JSOI07 OI07JS SOI07J 读出最后一列字符:I0O7SJ,就是加密后的字符串(其实这个加密手段实在很容易破解,鉴于这是突然想出来的,那就^^)。但是,如果想加密的字符串实在太长,你能写一个程序完成这个任务吗?
Input
输入文件包含一行,欲加密的字符串。注意字符串的内容不一定是字母、数字,也可以是符号等。
Output
输出一行,为加密后的字符串。
Sample Input
Sample Output
HINT
对于100%的数据字符串的长度不超过100000。
後綴數組不好理解,可以直接背下來,反正我是覺得基數排序後半部分簡直無法理解。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<queue>
#include<stack>
using namespace std;
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
#define MAXN 110000
#define MAXV MAXN*2
#define MAXE MAXV*200
typedef long long qword;
int n,m;
char str[MAXN];
int sa[MAXN];
int tsa[MAXN];
int rank[MAXN];
int trank[MAXN];
int sum[MAXN];
void Index_Sort(int jp)
{
int i;
memset(sum,,sizeof(sum));
for (i=;i<=n;i++)sum[rank[(i+jp-)%n+]]++;
for (i=;i<=m;i++)sum[i]+=sum[i-];
for (i=n;i>=;i--)
tsa[sum[rank[(i+jp-)%n+]]--]=i;
memset(sum,,sizeof(sum));
for (i=;i<=n;i++)sum[rank[sa[i]]]++;
for (i=;i<=m;i++)sum[i]+=sum[i-];
for (i=n;i>=;i--)
sa[sum[rank[tsa[i]]]--]=tsa[i];
}
void Suffix_Array()
{
int i,j,p;
for (i=;i<=n;i++)trank[i]=str[i-] - ;
for (i=;i<=n;i++)sum[trank[i]]++;
for (i=;i<=m;i++)sum[i]+=sum[i-];
for (i=n;i>=;i--)
sa[sum[trank[i]]--]=i;
rank[sa[]]=;
for (i=,p=;i<=n;i++)
{
if (trank[sa[i]]!=trank[sa[i-]])p++;
rank[sa[i]]=p;
}
for (j=;j<=n;j<<=)
{
Index_Sort(j);
trank[sa[]]=;
for (i=,p=;i<=n;i++)
{
if (rank[sa[i]]!=rank[sa[i-]] || rank[(sa[i]+j-)%n+]!=rank[(sa[i-]+j-)%n+])p++;
trank[sa[i]]=p;
}
for (i=;i<=n;i++)
rank[i]=trank[i];
}
}
int main()
{
freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int i,j,k;
int x,y,z;
// for(i=1;i<100;i++)
// printf("%d %c\n",i,i);
scanf("%s\n",&str);
n=strlen(str);
m=max(n,);
Suffix_Array();
for (i=;i<=n;i++)
printf("%c",str[(sa[i]-+n)%n]);
return ;
}
bzoj 1031: [JSOI2007]字符加密Cipher 後綴數組模板題的更多相关文章
- BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题
BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include &l ...
- BZOJ 1031: [JSOI2007]字符加密Cipher 后缀数组
1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6014 Solved: 2503[Submit ...
- BZOJ 1031 [JSOI2007]字符加密Cipher 后缀数组教程
1031: [JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一 ...
- bzoj 1031 [JSOI2007]字符加密Cipher 后缀数组模板
题目链接 题目描述 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: ...
- bzoj 1031: [JSOI2007]字符加密Cipher【后缀数组】
算是SA的裸题了 把串复制一遍接在原串后面,然后求SA,然后按着SA的顺序输出尾字符即可 #include<iostream> #include<cstdio> #includ ...
- bzoj 1031 [JSOI2007]字符加密Cipher
求出来后缀数组的rank就行了,不会可以去看集训队论文. #include<iostream> #include<cstdio> #include<cstring> ...
- 1031: [JSOI2007]字符加密Cipher
1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7338 Solved: 3182[Submit ...
- 后缀数组 1031: [JSOI2007]字符加密Cipher
/*1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4926 Solved: 2020[Submit ...
- 【BZOJ】1031: [JSOI2007]字符加密Cipher(后缀数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1031 很容易想到这就是将字符串复制到自己末尾然后后缀数组搞出sa然后按区间输出即可. 然后换了下模板 ...
随机推荐
- [rxjs] Creating An Observable with RxJS
Create an observable var Observable = Rx.Observable; var source = Observable.create(function(observe ...
- /dev/tty 与 /dev/pts
打开3个bash会话窗口 [root@server1 fd]# cd /proc/7489/fd[root@server1 fd]# ll总用量 0lrwx------ 1 root root 6 ...
- xshell十大技巧
xshell是我用过的最好用的ssh客户端工具,没有之一.这个软件完全免费,简单易用,可以满足通过ssh管理linux vps所有需要,唯一遗憾的是没有官方中文版. 警告:不要下载所谓的汉化版,可能有 ...
- GitHub安装失败
安装GitHub客户端的时候,会提示失败,如下: An error occurred trying to download 'http://github-windows.s3.amazonaws.co ...
- 微软未公开的 SP
一些用在SQL 2000的企业管理GUI中,并且不打算用于其他的流程.微软已预计将其中的一些存储过程从未来的SQL Server版本中删除(或已经删除了).虽然这些存储过程可能很有用并为你节省了很多时 ...
- 跟着老男孩一步步学习Shell高级编程实战
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1264627 本sh ...
- 利用case when 减少表扫描次数
数据库环境:SQL SERVER 2008R2 有网友希望有人帮他优化一下他的SQL,SQL语句如下: WITH T AS ( SELECT B.O_Money MON,B.O_States STAT ...
- (一)问候Struts2
第一节:Struts2 简介 主页:http://struts.apache.org/在用户请求和模块化处理方面以及页面的展现这块,Struts2 发挥的屌炸天作用:相对于传统的Jsp+Servlet ...
- 一行代码实现headView弹簧拉伸效果
前言 很多app的个人中心上部的headView都实现了弹簧拉伸的效果,即tableView的top并不随着下拉而滑动,而是紧紧的停在屏幕的最上方. 我们今天就分析一下这个效果的实现方式. 分析 关键 ...
- NSdate 时间格式
NSdate 时间格式 NSTimeInterval 时间间隔 基本单位 秒 NSDateFormatter 时间格式器 用于日期对象的格式化或字符串解析为日期对象 日期格式如下: y 年 M 年 ...