首页 技术 正文
技术 2022年11月15日
0 收藏 959 点赞 3,327 浏览 1315 个字

Description

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

BZOJ 1031 字符加密

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

后缀数组大裸题,将原串接在后面,求一遍sa,再遍历一遍sa即可。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std; #define maxn 200010
char s[maxn];
int sa[maxn],t[maxn];
int t2[maxn],c[maxn],n; inline void build(int m)
{
int i,*x = t,*y = t2;
memset(c,,*(m+));
for (i = ;i < n;++i) c[x[i] = s[i]]++;
for (i = ;i < m;++i) c[i] += c[i-];
for (i = n-;i >= ;--i) sa[--c[x[i]]] = i;
for (int k = ;k < n;k <<= )
{
int p = ;
for (i = n - k;i < n;++i) y[p++] = i;
for (i = ;i < n;++i) if (sa[i] >= k) y[p++] = sa[i]-k;
memset(c,,*(m+));
for (i = ;i < n;++i) c[x[y[i]]]++;
for (i = ;i < m;++i) c[i] += c[i-];
for (i = n - ;i >= ;--i) sa[--c[x[y[i]]]] = y[i];
swap(x,y);
p = ; x[sa[]] = ;
for (i = ;i < n;++i)
x[sa[i]] = (y[sa[i-]] == y[sa[i]] && y[sa[i-]+k] == y[sa[i]+k] ? p - :p++);
if (p >= n) break;
m = p;
}
} int main()
{
freopen("1031.in","r",stdin);
freopen("1031.out","w",stdout);
scanf("%s",s);
n = strlen(s);
for (int i = n;i < *n-;++i) s[i] = s[i - n];
n <<= ;
build();
for (int i = ;i < n;++i) if (sa[i] < (n >> )) printf("%c",s[sa[i]+(n >> ) - ]);
fclose(stdin); fclose(stdout);
return ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,085
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,560
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,409
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,182
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,819
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,902